123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- /*
- * mixed_xor.h
- *
- */
- #ifndef INCLUDE_CONTAINERS_MIXED_XOR_H_
- #define INCLUDE_CONTAINERS_MIXED_XOR_H_
- /* These functions appear to exclude cases where the
- * inputs have the same type and the output is guaranteed
- * to have the same type as the inputs. Eg, bitset unions
- */
- /*
- * Java implementation (as of May 2016) for array_run, run_run
- * and bitset_run don't do anything different for inplace.
- * (They are not truly in place.)
- */
- #include <roaring/containers/array.h>
- #include <roaring/containers/bitset.h>
- #include <roaring/containers/run.h>
- // #include "containers.h"
- #ifdef __cplusplus
- extern "C" {
- namespace roaring {
- namespace internal {
- #endif
- /* Compute the xor of src_1 and src_2 and write the result to
- * dst (which has no container initially).
- * Result is true iff dst is a bitset */
- bool array_bitset_container_xor(const array_container_t *src_1,
- const bitset_container_t *src_2,
- container_t **dst);
- /* Compute the xor of src_1 and src_2 and write the result to
- * dst. It is allowed for src_2 to be dst. This version does not
- * update the cardinality of dst (it is set to BITSET_UNKNOWN_CARDINALITY).
- */
- void array_bitset_container_lazy_xor(const array_container_t *src_1,
- const bitset_container_t *src_2,
- bitset_container_t *dst);
- /* Compute the xor of src_1 and src_2 and write the result to
- * dst (which has no container initially). Return value is
- * "dst is a bitset"
- */
- bool bitset_bitset_container_xor(const bitset_container_t *src_1,
- const bitset_container_t *src_2,
- container_t **dst);
- /* Compute the xor of src_1 and src_2 and write the result to
- * dst. Result may be either a bitset or an array container
- * (returns "result is bitset"). dst does not initially have
- * any container, but becomes either a bitset container (return
- * result true) or an array container.
- */
- bool run_bitset_container_xor(const run_container_t *src_1,
- const bitset_container_t *src_2,
- container_t **dst);
- /* lazy xor. Dst is initialized and may be equal to src_2.
- * Result is left as a bitset container, even if actual
- * cardinality would dictate an array container.
- */
- void run_bitset_container_lazy_xor(const run_container_t *src_1,
- const bitset_container_t *src_2,
- bitset_container_t *dst);
- /* dst does not indicate a valid container initially. Eventually it
- * can become any kind of container.
- */
- int array_run_container_xor(const array_container_t *src_1,
- const run_container_t *src_2, container_t **dst);
- /* dst does not initially have a valid container. Creates either
- * an array or a bitset container, indicated by return code
- */
- bool array_array_container_xor(const array_container_t *src_1,
- const array_container_t *src_2,
- container_t **dst);
- /* dst does not initially have a valid container. Creates either
- * an array or a bitset container, indicated by return code.
- * A bitset container will not have a valid cardinality and the
- * container type might not be correct for the actual cardinality
- */
- bool array_array_container_lazy_xor(const array_container_t *src_1,
- const array_container_t *src_2,
- container_t **dst);
- /* Dst is a valid run container. (Can it be src_2? Let's say not.)
- * Leaves result as run container, even if other options are
- * smaller.
- */
- void array_run_container_lazy_xor(const array_container_t *src_1,
- const run_container_t *src_2,
- run_container_t *dst);
- /* dst does not indicate a valid container initially. Eventually it
- * can become any kind of container.
- */
- int run_run_container_xor(const run_container_t *src_1,
- const run_container_t *src_2, container_t **dst);
- /* INPLACE versions (initial implementation may not exploit all inplace
- * opportunities (if any...)
- */
- /* Compute the xor of src_1 and src_2 and write the result to
- * dst (which has no container initially). It will modify src_1
- * to be dst if the result is a bitset. Otherwise, it will
- * free src_1 and dst will be a new array container. In both
- * cases, the caller is responsible for deallocating dst.
- * Returns true iff dst is a bitset */
- bool bitset_array_container_ixor(bitset_container_t *src_1,
- const array_container_t *src_2,
- container_t **dst);
- bool bitset_bitset_container_ixor(bitset_container_t *src_1,
- const bitset_container_t *src_2,
- container_t **dst);
- bool array_bitset_container_ixor(array_container_t *src_1,
- const bitset_container_t *src_2,
- container_t **dst);
- /* Compute the xor of src_1 and src_2 and write the result to
- * dst. Result may be either a bitset or an array container
- * (returns "result is bitset"). dst does not initially have
- * any container, but becomes either a bitset container (return
- * result true) or an array container.
- */
- bool run_bitset_container_ixor(run_container_t *src_1,
- const bitset_container_t *src_2,
- container_t **dst);
- bool bitset_run_container_ixor(bitset_container_t *src_1,
- const run_container_t *src_2, container_t **dst);
- /* dst does not indicate a valid container initially. Eventually it
- * can become any kind of container.
- */
- int array_run_container_ixor(array_container_t *src_1,
- const run_container_t *src_2, container_t **dst);
- int run_array_container_ixor(run_container_t *src_1,
- const array_container_t *src_2, container_t **dst);
- bool array_array_container_ixor(array_container_t *src_1,
- const array_container_t *src_2,
- container_t **dst);
- int run_run_container_ixor(run_container_t *src_1, const run_container_t *src_2,
- container_t **dst);
- #ifdef __cplusplus
- }
- }
- } // extern "C" { namespace roaring { namespace internal {
- #endif
- #endif
|