Skip to content

Commit

Permalink
Don't create a whole category for "enum" data types (#844)
Browse files Browse the repository at this point in the history
Signed-off-by: Juan Cruz Viotti <[email protected]>
  • Loading branch information
jviotti authored Oct 8, 2024
1 parent c9743d0 commit f4129ac
Show file tree
Hide file tree
Showing 14 changed files with 705 additions and 739 deletions.
26 changes: 13 additions & 13 deletions src/runtime/decoder_common.cc
Original file line number Diff line number Diff line change
Expand Up @@ -23,19 +23,19 @@ auto Decoder::read(const Encoding &encoding) -> sourcemeta::jsontoolkit::JSON {
HANDLE_DECODING(6, LARGE_CHOICE_INDEX)
HANDLE_DECODING(7, TOP_LEVEL_BYTE_CHOICE_INDEX)
HANDLE_DECODING(8, CONST_NONE)
HANDLE_DECODING(9, UTF8_STRING_NO_LENGTH)
HANDLE_DECODING(10, FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED)
HANDLE_DECODING(11, ROOF_VARINT_PREFIX_UTF8_STRING_SHARED)
HANDLE_DECODING(12, BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED)
HANDLE_DECODING(13, RFC3339_DATE_INTEGER_TRIPLET)
HANDLE_DECODING(14, PREFIX_VARINT_LENGTH_STRING_SHARED)
HANDLE_DECODING(15, FIXED_TYPED_ARRAY)
HANDLE_DECODING(16, BOUNDED_8BITS_TYPED_ARRAY)
HANDLE_DECODING(17, FLOOR_TYPED_ARRAY)
HANDLE_DECODING(18, ROOF_TYPED_ARRAY)
HANDLE_DECODING(19, FIXED_TYPED_ARBITRARY_OBJECT)
HANDLE_DECODING(20, VARINT_TYPED_ARBITRARY_OBJECT)
HANDLE_DECODING(21, ANY_PACKED_TYPE_TAG_BYTE_PREFIX)
HANDLE_DECODING(9, ANY_PACKED_TYPE_TAG_BYTE_PREFIX)
HANDLE_DECODING(10, UTF8_STRING_NO_LENGTH)
HANDLE_DECODING(11, FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED)
HANDLE_DECODING(12, ROOF_VARINT_PREFIX_UTF8_STRING_SHARED)
HANDLE_DECODING(13, BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED)
HANDLE_DECODING(14, RFC3339_DATE_INTEGER_TRIPLET)
HANDLE_DECODING(15, PREFIX_VARINT_LENGTH_STRING_SHARED)
HANDLE_DECODING(16, FIXED_TYPED_ARRAY)
HANDLE_DECODING(17, BOUNDED_8BITS_TYPED_ARRAY)
HANDLE_DECODING(18, FLOOR_TYPED_ARRAY)
HANDLE_DECODING(19, ROOF_TYPED_ARRAY)
HANDLE_DECODING(20, FIXED_TYPED_ARBITRARY_OBJECT)
HANDLE_DECODING(21, VARINT_TYPED_ARBITRARY_OBJECT)
#undef HANDLE_DECODING
}

Expand Down
26 changes: 13 additions & 13 deletions src/runtime/encoder_common.cc
Original file line number Diff line number Diff line change
Expand Up @@ -25,19 +25,19 @@ auto Encoder::write(const sourcemeta::jsontoolkit::JSON &document,
HANDLE_ENCODING(6, LARGE_CHOICE_INDEX)
HANDLE_ENCODING(7, TOP_LEVEL_BYTE_CHOICE_INDEX)
HANDLE_ENCODING(8, CONST_NONE)
HANDLE_ENCODING(9, UTF8_STRING_NO_LENGTH)
HANDLE_ENCODING(10, FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED)
HANDLE_ENCODING(11, ROOF_VARINT_PREFIX_UTF8_STRING_SHARED)
HANDLE_ENCODING(12, BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED)
HANDLE_ENCODING(13, RFC3339_DATE_INTEGER_TRIPLET)
HANDLE_ENCODING(14, PREFIX_VARINT_LENGTH_STRING_SHARED)
HANDLE_ENCODING(15, FIXED_TYPED_ARRAY)
HANDLE_ENCODING(16, BOUNDED_8BITS_TYPED_ARRAY)
HANDLE_ENCODING(17, FLOOR_TYPED_ARRAY)
HANDLE_ENCODING(18, ROOF_TYPED_ARRAY)
HANDLE_ENCODING(19, FIXED_TYPED_ARBITRARY_OBJECT)
HANDLE_ENCODING(20, VARINT_TYPED_ARBITRARY_OBJECT)
HANDLE_ENCODING(21, ANY_PACKED_TYPE_TAG_BYTE_PREFIX)
HANDLE_ENCODING(9, ANY_PACKED_TYPE_TAG_BYTE_PREFIX)
HANDLE_ENCODING(10, UTF8_STRING_NO_LENGTH)
HANDLE_ENCODING(11, FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED)
HANDLE_ENCODING(12, ROOF_VARINT_PREFIX_UTF8_STRING_SHARED)
HANDLE_ENCODING(13, BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED)
HANDLE_ENCODING(14, RFC3339_DATE_INTEGER_TRIPLET)
HANDLE_ENCODING(15, PREFIX_VARINT_LENGTH_STRING_SHARED)
HANDLE_ENCODING(16, FIXED_TYPED_ARRAY)
HANDLE_ENCODING(17, BOUNDED_8BITS_TYPED_ARRAY)
HANDLE_ENCODING(18, FLOOR_TYPED_ARRAY)
HANDLE_ENCODING(19, ROOF_TYPED_ARRAY)
HANDLE_ENCODING(20, FIXED_TYPED_ARBITRARY_OBJECT)
HANDLE_ENCODING(21, VARINT_TYPED_ARBITRARY_OBJECT)
#undef HANDLE_ENCODING
}

Expand Down
124 changes: 58 additions & 66 deletions src/runtime/include/sourcemeta/jsonbinpack/runtime_encoding.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ struct BYTE_CHOICE_INDEX;
struct LARGE_CHOICE_INDEX;
struct TOP_LEVEL_BYTE_CHOICE_INDEX;
struct CONST_NONE;
struct ANY_PACKED_TYPE_TAG_BYTE_PREFIX;
struct UTF8_STRING_NO_LENGTH;
struct FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED;
struct ROOF_VARINT_PREFIX_UTF8_STRING_SHARED;
Expand All @@ -36,7 +37,6 @@ struct FLOOR_TYPED_ARRAY;
struct ROOF_TYPED_ARRAY;
struct FIXED_TYPED_ARBITRARY_OBJECT;
struct VARINT_TYPED_ARBITRARY_OBJECT;
struct ANY_PACKED_TYPE_TAG_BYTE_PREFIX;
#endif

/// @ingroup runtime
Expand All @@ -45,14 +45,13 @@ using Encoding = std::variant<
BOUNDED_MULTIPLE_8BITS_ENUM_FIXED, FLOOR_MULTIPLE_ENUM_VARINT,
ROOF_MULTIPLE_MIRROR_ENUM_VARINT, ARBITRARY_MULTIPLE_ZIGZAG_VARINT,
DOUBLE_VARINT_TUPLE, BYTE_CHOICE_INDEX, LARGE_CHOICE_INDEX,
TOP_LEVEL_BYTE_CHOICE_INDEX, CONST_NONE, UTF8_STRING_NO_LENGTH,
FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED,
TOP_LEVEL_BYTE_CHOICE_INDEX, CONST_NONE, ANY_PACKED_TYPE_TAG_BYTE_PREFIX,
UTF8_STRING_NO_LENGTH, FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED,
ROOF_VARINT_PREFIX_UTF8_STRING_SHARED,
BOUNDED_8BIT_PREFIX_UTF8_STRING_SHARED, RFC3339_DATE_INTEGER_TRIPLET,
PREFIX_VARINT_LENGTH_STRING_SHARED, FIXED_TYPED_ARRAY,
BOUNDED_8BITS_TYPED_ARRAY, FLOOR_TYPED_ARRAY, ROOF_TYPED_ARRAY,
FIXED_TYPED_ARBITRARY_OBJECT, VARINT_TYPED_ARBITRARY_OBJECT,
ANY_PACKED_TYPE_TAG_BYTE_PREFIX>;
FIXED_TYPED_ARBITRARY_OBJECT, VARINT_TYPED_ARBITRARY_OBJECT>;

/// @ingroup runtime
/// @defgroup encoding_integer Integer Encodings
Expand Down Expand Up @@ -260,7 +259,7 @@ struct DOUBLE_VARINT_TUPLE {};
/// @}

/// @ingroup runtime
/// @defgroup encoding_enum Enumeration Encodings
/// @defgroup encoding_any Any Encodings
/// @{

// clang-format off
Expand Down Expand Up @@ -401,6 +400,59 @@ struct CONST_NONE {
const sourcemeta::jsontoolkit::JSON value;
};

// TODO: Write brief description
struct ANY_PACKED_TYPE_TAG_BYTE_PREFIX {};
#ifndef DOXYGEN
namespace internal::ANY_PACKED_TYPE_TAG_BYTE_PREFIX {
constexpr auto type_size = 3;
constexpr std::uint8_t TYPE_SHARED_STRING = 0b00000000;
constexpr std::uint8_t TYPE_STRING = 0b00000001;
constexpr std::uint8_t TYPE_LONG_STRING = 0b00000010;
constexpr std::uint8_t TYPE_OBJECT = 0b00000011;
constexpr std::uint8_t TYPE_ARRAY = 0b00000100;
constexpr std::uint8_t TYPE_POSITIVE_INTEGER_BYTE = 0b00000101;
constexpr std::uint8_t TYPE_NEGATIVE_INTEGER_BYTE = 0b00000110;
constexpr std::uint8_t TYPE_OTHER = 0b00000111;
static_assert(TYPE_SHARED_STRING <= uint_max<type_size>);
static_assert(TYPE_STRING <= uint_max<type_size>);
static_assert(TYPE_LONG_STRING <= uint_max<type_size>);
static_assert(TYPE_OBJECT <= uint_max<type_size>);
static_assert(TYPE_ARRAY <= uint_max<type_size>);
static_assert(TYPE_POSITIVE_INTEGER_BYTE <= uint_max<type_size>);
static_assert(TYPE_NEGATIVE_INTEGER_BYTE <= uint_max<type_size>);
static_assert(TYPE_OTHER <= uint_max<type_size>);

constexpr auto subtype_size = 5;
constexpr std::uint8_t SUBTYPE_FALSE = 0b00000000;
constexpr std::uint8_t SUBTYPE_TRUE = 0b00000001;
constexpr std::uint8_t SUBTYPE_NULL = 0b00000010;
constexpr std::uint8_t SUBTYPE_POSITIVE_INTEGER = 0b00000011;
constexpr std::uint8_t SUBTYPE_NEGATIVE_INTEGER = 0b00000100;
constexpr std::uint8_t SUBTYPE_NUMBER = 0b00000101;
constexpr std::uint8_t SUBTYPE_LONG_STRING_BASE_EXPONENT_7 = 0b00000111;
constexpr std::uint8_t SUBTYPE_LONG_STRING_BASE_EXPONENT_8 = 0b00001000;
constexpr std::uint8_t SUBTYPE_LONG_STRING_BASE_EXPONENT_9 = 0b00001001;
constexpr std::uint8_t SUBTYPE_LONG_STRING_BASE_EXPONENT_10 = 0b00001010;

static_assert(SUBTYPE_FALSE <= uint_max<subtype_size>);
static_assert(SUBTYPE_TRUE <= uint_max<subtype_size>);
static_assert(SUBTYPE_NULL <= uint_max<subtype_size>);
static_assert(SUBTYPE_POSITIVE_INTEGER <= uint_max<subtype_size>);
static_assert(SUBTYPE_NEGATIVE_INTEGER <= uint_max<subtype_size>);
static_assert(SUBTYPE_NUMBER <= uint_max<subtype_size>);
static_assert(SUBTYPE_LONG_STRING_BASE_EXPONENT_7 <= uint_max<subtype_size>);
static_assert(SUBTYPE_LONG_STRING_BASE_EXPONENT_8 <= uint_max<subtype_size>);
static_assert(SUBTYPE_LONG_STRING_BASE_EXPONENT_9 <= uint_max<subtype_size>);
static_assert(SUBTYPE_LONG_STRING_BASE_EXPONENT_10 <= uint_max<subtype_size>);

// Note that the binary values actually match the declared exponents
static_assert(SUBTYPE_LONG_STRING_BASE_EXPONENT_7 == 7);
static_assert(SUBTYPE_LONG_STRING_BASE_EXPONENT_8 == 8);
static_assert(SUBTYPE_LONG_STRING_BASE_EXPONENT_9 == 9);
static_assert(SUBTYPE_LONG_STRING_BASE_EXPONENT_10 == 10);
} // namespace internal::ANY_PACKED_TYPE_TAG_BYTE_PREFIX
#endif

/// @}

/// @ingroup runtime
Expand Down Expand Up @@ -987,66 +1039,6 @@ struct VARINT_TYPED_ARBITRARY_OBJECT {

/// @}

/// @ingroup runtime
/// @defgroup encoding_any Any Encodings
/// @{

// TODO: Write brief description
struct ANY_PACKED_TYPE_TAG_BYTE_PREFIX {};
#ifndef DOXYGEN
namespace internal::ANY_PACKED_TYPE_TAG_BYTE_PREFIX {
constexpr auto type_size = 3;
constexpr std::uint8_t TYPE_SHARED_STRING = 0b00000000;
constexpr std::uint8_t TYPE_STRING = 0b00000001;
constexpr std::uint8_t TYPE_LONG_STRING = 0b00000010;
constexpr std::uint8_t TYPE_OBJECT = 0b00000011;
constexpr std::uint8_t TYPE_ARRAY = 0b00000100;
constexpr std::uint8_t TYPE_POSITIVE_INTEGER_BYTE = 0b00000101;
constexpr std::uint8_t TYPE_NEGATIVE_INTEGER_BYTE = 0b00000110;
constexpr std::uint8_t TYPE_OTHER = 0b00000111;
static_assert(TYPE_SHARED_STRING <= uint_max<type_size>);
static_assert(TYPE_STRING <= uint_max<type_size>);
static_assert(TYPE_LONG_STRING <= uint_max<type_size>);
static_assert(TYPE_OBJECT <= uint_max<type_size>);
static_assert(TYPE_ARRAY <= uint_max<type_size>);
static_assert(TYPE_POSITIVE_INTEGER_BYTE <= uint_max<type_size>);
static_assert(TYPE_NEGATIVE_INTEGER_BYTE <= uint_max<type_size>);
static_assert(TYPE_OTHER <= uint_max<type_size>);

constexpr auto subtype_size = 5;
constexpr std::uint8_t SUBTYPE_FALSE = 0b00000000;
constexpr std::uint8_t SUBTYPE_TRUE = 0b00000001;
constexpr std::uint8_t SUBTYPE_NULL = 0b00000010;
constexpr std::uint8_t SUBTYPE_POSITIVE_INTEGER = 0b00000011;
constexpr std::uint8_t SUBTYPE_NEGATIVE_INTEGER = 0b00000100;
constexpr std::uint8_t SUBTYPE_NUMBER = 0b00000101;
constexpr std::uint8_t SUBTYPE_LONG_STRING_BASE_EXPONENT_7 = 0b00000111;
constexpr std::uint8_t SUBTYPE_LONG_STRING_BASE_EXPONENT_8 = 0b00001000;
constexpr std::uint8_t SUBTYPE_LONG_STRING_BASE_EXPONENT_9 = 0b00001001;
constexpr std::uint8_t SUBTYPE_LONG_STRING_BASE_EXPONENT_10 = 0b00001010;

static_assert(SUBTYPE_FALSE <= uint_max<subtype_size>);
static_assert(SUBTYPE_TRUE <= uint_max<subtype_size>);
static_assert(SUBTYPE_NULL <= uint_max<subtype_size>);
static_assert(SUBTYPE_POSITIVE_INTEGER <= uint_max<subtype_size>);
static_assert(SUBTYPE_NEGATIVE_INTEGER <= uint_max<subtype_size>);
static_assert(SUBTYPE_NUMBER <= uint_max<subtype_size>);
static_assert(SUBTYPE_LONG_STRING_BASE_EXPONENT_7 <= uint_max<subtype_size>);
static_assert(SUBTYPE_LONG_STRING_BASE_EXPONENT_8 <= uint_max<subtype_size>);
static_assert(SUBTYPE_LONG_STRING_BASE_EXPONENT_9 <= uint_max<subtype_size>);
static_assert(SUBTYPE_LONG_STRING_BASE_EXPONENT_10 <= uint_max<subtype_size>);

// Note that the binary values actually match the declared exponents
static_assert(SUBTYPE_LONG_STRING_BASE_EXPONENT_7 == 7);
static_assert(SUBTYPE_LONG_STRING_BASE_EXPONENT_8 == 8);
static_assert(SUBTYPE_LONG_STRING_BASE_EXPONENT_9 == 9);
static_assert(SUBTYPE_LONG_STRING_BASE_EXPONENT_10 == 10);
} // namespace internal::ANY_PACKED_TYPE_TAG_BYTE_PREFIX
#endif

/// @}
// clang-format on

} // namespace sourcemeta::jsonbinpack

#endif
6 changes: 3 additions & 3 deletions src/runtime/loader.cc
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,12 @@ auto load(const sourcemeta::jsontoolkit::JSON &input) -> Encoding {
PARSE_ENCODING(v1, ARBITRARY_MULTIPLE_ZIGZAG_VARINT)
// Numbers
PARSE_ENCODING(v1, DOUBLE_VARINT_TUPLE)
// Enumerations
// Any
PARSE_ENCODING(v1, BYTE_CHOICE_INDEX)
PARSE_ENCODING(v1, LARGE_CHOICE_INDEX)
PARSE_ENCODING(v1, TOP_LEVEL_BYTE_CHOICE_INDEX)
PARSE_ENCODING(v1, CONST_NONE)
PARSE_ENCODING(v1, ANY_PACKED_TYPE_TAG_BYTE_PREFIX)
// Strings
PARSE_ENCODING(v1, UTF8_STRING_NO_LENGTH)
PARSE_ENCODING(v1, FLOOR_VARINT_PREFIX_UTF8_STRING_SHARED)
Expand All @@ -46,9 +47,8 @@ auto load(const sourcemeta::jsontoolkit::JSON &input) -> Encoding {
PARSE_ENCODING(v1, BOUNDED_8BITS_TYPED_ARRAY)
PARSE_ENCODING(v1, FLOOR_TYPED_ARRAY)
PARSE_ENCODING(v1, ROOF_TYPED_ARRAY)

// TODO: Handle object encodings
// Any
PARSE_ENCODING(v1, ANY_PACKED_TYPE_TAG_BYTE_PREFIX)

#undef PARSE_ENCODING

Expand Down
63 changes: 63 additions & 0 deletions test/compiler/2020_12_compiler_any_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,69 @@
#include <sourcemeta/jsonbinpack/compiler.h>
#include <sourcemeta/jsontoolkit/json.h>

TEST(JSONBinPack_Compiler_Any_2020_12, enum_singleton) {
auto schema = sourcemeta::jsontoolkit::parse(R"JSON({
"$schema": "https://json-schema.org/draft/2020-12/schema",
"enum": [ 2 ]
})JSON");

sourcemeta::jsonbinpack::compile(
schema, sourcemeta::jsontoolkit::default_schema_walker,
sourcemeta::jsontoolkit::official_resolver);

const auto expected = sourcemeta::jsontoolkit::parse(R"JSON({
"$schema": "tag:sourcemeta.com,2024:jsonbinpack/encoding/v1",
"binpackEncoding": "CONST_NONE",
"binpackOptions": {
"value": 2
}
})JSON");

EXPECT_EQ(schema, expected);
}

TEST(JSONBinPack_Compiler_Any_2020_12, const_scalar) {
auto schema = sourcemeta::jsontoolkit::parse(R"JSON({
"$schema": "https://json-schema.org/draft/2020-12/schema",
"const": 2
})JSON");

sourcemeta::jsonbinpack::compile(
schema, sourcemeta::jsontoolkit::default_schema_walker,
sourcemeta::jsontoolkit::official_resolver);

const auto expected = sourcemeta::jsontoolkit::parse(R"JSON({
"$schema": "tag:sourcemeta.com,2024:jsonbinpack/encoding/v1",
"binpackEncoding": "CONST_NONE",
"binpackOptions": {
"value": 2
}
})JSON");

EXPECT_EQ(schema, expected);
}

TEST(JSONBinPack_Compiler_Any_2020_12, enum_small_top_level) {
auto schema = sourcemeta::jsontoolkit::parse(R"JSON({
"$schema": "https://json-schema.org/draft/2020-12/schema",
"enum": [ 1, 2, 3 ]
})JSON");

sourcemeta::jsonbinpack::compile(
schema, sourcemeta::jsontoolkit::default_schema_walker,
sourcemeta::jsontoolkit::official_resolver);

const auto expected = sourcemeta::jsontoolkit::parse(R"JSON({
"$schema": "tag:sourcemeta.com,2024:jsonbinpack/encoding/v1",
"binpackEncoding": "TOP_LEVEL_BYTE_CHOICE_INDEX",
"binpackOptions": {
"choices": [ 1, 2, 3 ]
}
})JSON");

EXPECT_EQ(schema, expected);
}

TEST(JSONBinPack_Compiler_Any_2020_12, only_metaschema) {
auto schema = sourcemeta::jsontoolkit::parse(R"JSON({
"$schema": "https://json-schema.org/draft/2020-12/schema"
Expand Down
67 changes: 0 additions & 67 deletions test/compiler/2020_12_compiler_enum_test.cc

This file was deleted.

Loading

0 comments on commit f4129ac

Please sign in to comment.