1 | /*------------------------------------------------------------------------- |
2 | * |
3 | * varbit.h |
4 | * Functions for the SQL datatypes BIT() and BIT VARYING(). |
5 | * |
6 | * Code originally contributed by Adriaan Joubert. |
7 | * |
8 | * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group |
9 | * Portions Copyright (c) 1994, Regents of the University of California |
10 | * |
11 | * src/include/utils/varbit.h |
12 | * |
13 | *------------------------------------------------------------------------- |
14 | */ |
15 | #ifndef VARBIT_H |
16 | #define VARBIT_H |
17 | |
18 | #include <limits.h> |
19 | |
20 | #include "fmgr.h" |
21 | |
22 | /* |
23 | * Modeled on struct varlena from postgres.h, but data type is bits8. |
24 | * |
25 | * Caution: if bit_len is not a multiple of BITS_PER_BYTE, the low-order |
26 | * bits of the last byte of bit_dat[] are unused and MUST be zeroes. |
27 | * (This allows bit_cmp() to not bother masking the last byte.) |
28 | * Also, there should not be any excess bytes counted in the header length. |
29 | */ |
30 | typedef struct |
31 | { |
32 | int32 vl_len_; /* varlena header (do not touch directly!) */ |
33 | int32 bit_len; /* number of valid bits */ |
34 | bits8 bit_dat[FLEXIBLE_ARRAY_MEMBER]; /* bit string, most sig. byte |
35 | * first */ |
36 | } VarBit; |
37 | |
38 | /* |
39 | * fmgr interface macros |
40 | * |
41 | * BIT and BIT VARYING are toastable varlena types. They are the same |
42 | * as far as representation goes, so we just have one set of macros. |
43 | */ |
44 | #define DatumGetVarBitP(X) ((VarBit *) PG_DETOAST_DATUM(X)) |
45 | #define DatumGetVarBitPCopy(X) ((VarBit *) PG_DETOAST_DATUM_COPY(X)) |
46 | #define VarBitPGetDatum(X) PointerGetDatum(X) |
47 | #define PG_GETARG_VARBIT_P(n) DatumGetVarBitP(PG_GETARG_DATUM(n)) |
48 | #define PG_GETARG_VARBIT_P_COPY(n) DatumGetVarBitPCopy(PG_GETARG_DATUM(n)) |
49 | #define PG_RETURN_VARBIT_P(x) return VarBitPGetDatum(x) |
50 | |
51 | /* Header overhead *in addition to* VARHDRSZ */ |
52 | #define VARBITHDRSZ sizeof(int32) |
53 | /* Number of bits in this bit string */ |
54 | #define VARBITLEN(PTR) (((VarBit *) (PTR))->bit_len) |
55 | /* Pointer to the first byte containing bit string data */ |
56 | #define VARBITS(PTR) (((VarBit *) (PTR))->bit_dat) |
57 | /* Number of bytes in the data section of a bit string */ |
58 | #define VARBITBYTES(PTR) (VARSIZE(PTR) - VARHDRSZ - VARBITHDRSZ) |
59 | /* Padding of the bit string at the end (in bits) */ |
60 | #define VARBITPAD(PTR) (VARBITBYTES(PTR)*BITS_PER_BYTE - VARBITLEN(PTR)) |
61 | /* Number of bytes needed to store a bit string of a given length */ |
62 | #define VARBITTOTALLEN(BITLEN) (((BITLEN) + BITS_PER_BYTE-1)/BITS_PER_BYTE + \ |
63 | VARHDRSZ + VARBITHDRSZ) |
64 | /* |
65 | * Maximum number of bits. Several code sites assume no overflow from |
66 | * computing bitlen + X; VARBITTOTALLEN() has the largest such X. |
67 | */ |
68 | #define VARBITMAXLEN (INT_MAX - BITS_PER_BYTE + 1) |
69 | /* pointer beyond the end of the bit string (like end() in STL containers) */ |
70 | #define VARBITEND(PTR) (((bits8 *) (PTR)) + VARSIZE(PTR)) |
71 | /* Mask that will cover exactly one byte, i.e. BITS_PER_BYTE bits */ |
72 | #define BITMASK 0xFF |
73 | |
74 | #endif |
75 | |