1/*
2 * Copyright (c) 2015-2016, Intel Corporation
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * * Redistributions of source code must retain the above copyright notice,
8 * this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of Intel Corporation nor the names of its contributors
13 * may be used to endorse or promote products derived from this software
14 * without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#ifndef FATBIT_H
30#define FATBIT_H
31
32/** \file
33 * \brief Multibit: fast bitset structure for use in scratch.
34 * Uses more space than mmbit, to avoid partial words for hopefully a taddy more
35 * performance.
36 *
37 * API is also trimmed down.
38 */
39
40#include "multibit.h"
41#include "ue2common.h"
42
43#ifdef __cplusplus
44extern "C" {
45#endif
46
47#define MIN_FAT_SIZE 32
48
49struct fatbit {
50 union {
51 u64a flat[MIN_FAT_SIZE / sizeof(u64a)];
52 u8 raw[MIN_FAT_SIZE];
53 } fb_int;
54 u64a tail[];
55};
56
57static really_inline
58void fatbit_clear(struct fatbit *bits) {
59 assert(ISALIGNED(bits));
60 memset(bits, 0, sizeof(struct fatbit));
61}
62
63static really_inline
64char fatbit_set(struct fatbit *bits, u32 total_bits, u32 key) {
65 assert(ISALIGNED(bits));
66 return mmbit_set(bits->fb_int.raw, total_bits, key);
67}
68
69static really_inline
70void fatbit_unset(struct fatbit *bits, u32 total_bits, u32 key) {
71 assert(ISALIGNED(bits));
72 mmbit_unset(bits->fb_int.raw, total_bits, key);
73}
74
75static really_inline
76char fatbit_isset(const struct fatbit *bits, u32 total_bits, u32 key) {
77 assert(ISALIGNED(bits));
78 return mmbit_isset(bits->fb_int.raw, total_bits, key);
79}
80
81static really_inline
82u32 fatbit_iterate(const struct fatbit *bits, u32 total_bits, u32 it_in) {
83 assert(ISALIGNED(bits));
84 /* TODO: iterate_flat could be specialised as we don't have to worry about
85 * partial blocks. */
86 return mmbit_iterate(bits->fb_int.raw, total_bits, it_in);
87}
88
89#ifdef __cplusplus
90} // extern "C"
91#endif
92
93#endif
94