-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathencoder_array.cc
More file actions
63 lines (55 loc) · 2.47 KB
/
Copy pathencoder_array.cc
File metadata and controls
63 lines (55 loc) · 2.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <sourcemeta/jsonbinpack/runtime_encoder.h>
#include <sourcemeta/core/numeric.h>
#include <cassert> // assert
#include <cstdint> // std::uint8_t
#include <utility> // std::move
namespace sourcemeta::jsonbinpack {
auto Encoder::FIXED_TYPED_ARRAY(const sourcemeta::core::JSON &document,
const struct FIXED_TYPED_ARRAY &options)
-> void {
assert(document.is_array());
assert(document.size() == options.size);
const auto prefix_encodings{options.prefix_encodings.size()};
assert(prefix_encodings <= document.size());
for (std::size_t index = 0; index < options.size; index++) {
const Encoding &encoding{prefix_encodings > index
? options.prefix_encodings[index]
: *(options.encoding)};
this->write(document.at(index), encoding);
}
}
auto Encoder::BOUNDED_8BITS_TYPED_ARRAY(
const sourcemeta::core::JSON &document,
const struct BOUNDED_8BITS_TYPED_ARRAY &options) -> void {
assert(options.maximum >= options.minimum);
const auto size{document.size()};
assert(sourcemeta::core::is_within(size, options.minimum, options.maximum));
assert(sourcemeta::core::is_byte(options.maximum - options.minimum));
this->put_byte(static_cast<std::uint8_t>(size - options.minimum));
this->FIXED_TYPED_ARRAY(document,
{.size = size,
.encoding = options.encoding,
.prefix_encodings = options.prefix_encodings});
}
auto Encoder::FLOOR_TYPED_ARRAY(const sourcemeta::core::JSON &document,
const struct FLOOR_TYPED_ARRAY &options)
-> void {
const auto size{document.size()};
assert(size >= options.minimum);
this->put_varint(size - options.minimum);
this->FIXED_TYPED_ARRAY(document,
{.size = size,
.encoding = options.encoding,
.prefix_encodings = options.prefix_encodings});
}
auto Encoder::ROOF_TYPED_ARRAY(const sourcemeta::core::JSON &document,
const struct ROOF_TYPED_ARRAY &options) -> void {
const auto size{document.size()};
assert(size <= options.maximum);
this->put_varint(options.maximum - size);
this->FIXED_TYPED_ARRAY(document,
{.size = size,
.encoding = options.encoding,
.prefix_encodings = options.prefix_encodings});
}
} // namespace sourcemeta::jsonbinpack