Couchbase Lite C
Couchbase Lite C API
FLSlice.h
Go to the documentation of this file.
1//
2// FLSlice.h
3// Fleece
4//
5// Created by Jens Alfke on 8/13/18.
6// Copyright 2018-Present Couchbase, Inc.
7//
8// Use of this software is governed by the Business Source License included
9// in the file licenses/BSL-Couchbase.txt. As of the Change Date specified
10// in that file, in accordance with the Business Source License, use of this
11// software will be governed by the Apache License, Version 2.0, included in
12// the file licenses/APL2.txt.
13//
14
15#pragma once
16#ifndef _FLSLICE_H
17#define _FLSLICE_H
18
19#include "CompilerSupport.h"
20#include <stdbool.h>
21#include <stdint.h>
22#include <stdlib.h>
23#include <string.h>
24
25
26#ifdef __cplusplus
27 #include <string>
28 namespace fleece { struct alloc_slice; }
29#endif
30
31
33
34#ifdef __cplusplus
35extern "C" {
36#endif
37
38
45typedef struct FLSlice {
46 const void* FL_NULLABLE buf;
47 size_t size;
48
49#ifdef __cplusplus
50 explicit operator bool() const noexcept FLPURE {return buf != nullptr;}
51 explicit operator std::string() const {return std::string((char*)buf, size);}
52#endif
53} FLSlice;
54
55
64 const void* FL_NULLABLE buf;
65 size_t size;
66
67#ifdef __cplusplus
68 explicit operator bool() const noexcept FLPURE {return buf != nullptr;}
69 explicit operator FLSlice () const {return {buf, size};}
70 inline explicit operator std::string() const;
71#endif
72};
73typedef struct FLSliceResult FLSliceResult;
74
75
79#ifdef __cplusplus
80 struct FLHeapSlice : public FLSlice {
81 constexpr FLHeapSlice() noexcept :FLSlice{nullptr, 0} { }
82 private:
83 constexpr FLHeapSlice(const void *FL_NULLABLE b, size_t s) noexcept :FLSlice{b, s} { }
84 friend struct fleece::alloc_slice;
85 };
86#else
88#endif
89
90
91// Aliases used to indicate that a slice is expected to contain UTF-8 data.
94
95
97#ifdef _MSC_VER
98 static const FLSlice kFLSliceNull = { NULL, 0 };
99#else
100 #define kFLSliceNull ((FLSlice){NULL, 0})
101#endif
102
103
106static inline FLPURE int FLMemCmp(const void * FL_NULLABLE a,
107 const void * FL_NULLABLE b, size_t size) FLAPI
108{
109 if (_usuallyFalse(size == 0))
110 return 0;
111 return memcmp(a, b, size);
112}
113
116static inline void FLMemCpy(void* FL_NULLABLE dst, const void* FL_NULLABLE src, size_t size) FLAPI {
117 if (_usuallyTrue(size > 0))
118 memcpy(dst, src, size);
119}
120
121
126static inline FLSlice FLStr(const char* FL_NULLABLE str) FLAPI {
127 FLSlice foo = { str, str ? strlen(str) : 0 };
128 return foo;
129}
130
133#ifdef __cplusplus
134 #define FLSTR(STR) (FLSlice {("" STR), sizeof(("" STR))-1})
135#else
136 #define FLSTR(STR) ((FLSlice){("" STR), sizeof(("" STR))-1})
137#endif
138
139
142
146
149
157FLEECE_PUBLIC bool FLSlice_ToCString(FLSlice s, char* buffer, size_t capacity) FLAPI;
158
161
164
165
167static inline FLSliceResult FLSliceResult_CreateWith(const void* FL_NULLABLE bytes, size_t size) FLAPI {
168 FLSlice s = {bytes, size};
169 return FLSlice_Copy(s);
170}
171
172
173FLEECE_PUBLIC void _FLBuf_Retain(const void* FL_NULLABLE) FLAPI; // internal; do not call
174FLEECE_PUBLIC void _FLBuf_Release(const void* FL_NULLABLE) FLAPI; // internal; do not call
175
178 _FLBuf_Retain(s.buf);
179 return s;
180}
181
184 _FLBuf_Release(s.buf);
185}
186
189 FLSlice ret;
190 memcpy(&ret, &sr, sizeof(ret));
191 return ret;
192}
193
194
198FLEECE_PUBLIC void FL_WipeMemory(void *dst, size_t size) FLAPI;
199
200
203#ifdef __cplusplus
204}
205
206 FLPURE static inline bool operator== (FLSlice s1, FLSlice s2) {return FLSlice_Equal(s1, s2);}
207 FLPURE static inline bool operator!= (FLSlice s1, FLSlice s2) {return !(s1 == s2);}
208
209 FLPURE static inline bool operator== (FLSliceResult sr, FLSlice s) {return (FLSlice)sr == s;}
210 FLPURE static inline bool operator!= (FLSliceResult sr, FLSlice s) {return !(sr ==s);}
211
212
213 FLSliceResult::operator std::string () const {
214 auto str = std::string((char*)buf, size);
216 return str;
217 }
218#endif
219
221#endif // _FLSLICE_H
#define FL_NULLABLE
Definition: CompilerSupport.h:87
#define FLEECE_PUBLIC
Definition: CompilerSupport.h:254
#define FL_ASSUME_NONNULL_BEGIN
Definition: CompilerSupport.h:85
#define _usuallyTrue(VAL)
Definition: CompilerSupport.h:68
#define _usuallyFalse(VAL)
Definition: CompilerSupport.h:69
#define FLPURE
Definition: CompilerSupport.h:123
#define NODISCARD
Definition: CompilerSupport.h:59
#define FL_ASSUME_NONNULL_END
Definition: CompilerSupport.h:86
#define FLAPI
Definition: CompilerSupport.h:260
FLEECE_PUBLIC void _FLBuf_Release(const void *FL_NULLABLE)
static void FLSliceResult_Release(FLSliceResult s)
Decrements the ref-count of a FLSliceResult, freeing its memory if it reached zero.
Definition: FLSlice.h:183
FLEECE_PUBLIC void FL_WipeMemory(void *dst, size_t size)
Writes zeroes to size bytes of memory starting at dst.
FLEECE_PUBLIC void _FLBuf_Retain(const void *FL_NULLABLE)
FLEECE_PUBLIC FLSliceResult FLSliceResult_New(size_t)
Allocates an FLSliceResult of the given size, without initializing the buffer.
#define kFLSliceNull
A convenient constant denoting a null slice.
Definition: FLSlice.h:100
FLEECE_PUBLIC bool FLSlice_Equal(FLSlice a, FLSlice b) FLPURE
Equality test of two slices.
static void FLMemCpy(void *FL_NULLABLE dst, const void *FL_NULLABLE src, size_t size)
Exactly like memcmp, but safely handles the case where dst or src is NULL and size is 0 (as a no-op),...
Definition: FLSlice.h:116
static FLSliceResult FLSliceResult_Retain(FLSliceResult s)
Increments the ref-count of a FLSliceResult.
Definition: FLSlice.h:177
static FLSliceResult FLSliceResult_CreateWith(const void *FL_NULLABLE bytes, size_t size)
Allocates an FLSliceResult, copying size bytes starting at buf.
Definition: FLSlice.h:167
FLSliceResult FLStringResult
Definition: FLSlice.h:93
static FLSlice FLStr(const char *FL_NULLABLE str)
Returns a slice pointing to the contents of a C string.
Definition: FLSlice.h:126
FLSlice FLString
Definition: FLSlice.h:92
FLSlice FLHeapSlice
A heap-allocated, reference-counted slice.
Definition: FLSlice.h:87
static FLSlice FLSliceResult_AsSlice(FLSliceResult sr)
Type-casts a FLSliceResult to FLSlice, since C doesn't know it's a subclass.
Definition: FLSlice.h:188
static FLPURE int FLMemCmp(const void *FL_NULLABLE a, const void *FL_NULLABLE b, size_t size)
Exactly like memcmp, but safely handles the case where a or b is NULL and size is 0 (by returning 0),...
Definition: FLSlice.h:106
FLEECE_PUBLIC bool FLSlice_ToCString(FLSlice s, char *buffer, size_t capacity)
Copies a slice to a buffer, adding a trailing zero byte to make it a valid C string.
FLEECE_PUBLIC int FLSlice_Compare(FLSlice, FLSlice) FLPURE
Lexicographic comparison of two slices; basically like memcmp(), but taking into account differences ...
FLEECE_PUBLIC uint32_t FLSlice_Hash(FLSlice s) FLPURE
Computes a 32-bit hash of a slice's data, suitable for use in hash tables.
FLEECE_PUBLIC FLSliceResult FLSlice_Copy(FLSlice)
Allocates an FLSliceResult, copying the given slice.
A simple reference to a block of memory.
Definition: FLSlice.h:45
size_t size
Definition: FLSlice.h:47
const void *FL_NULLABLE buf
Definition: FLSlice.h:46
A heap-allocated block of memory returned from an API call.
Definition: FLSlice.h:63
const void *FL_NULLABLE buf
Definition: FLSlice.h:64
size_t size
Definition: FLSlice.h:65