Skip to content

Commit 5bc1ff0

Browse files
committed
tagged types
Signed-off-by: Dmitriy Khaustov aka xDimon <[email protected]>
1 parent 9253552 commit 5bc1ff0

File tree

9 files changed

+129
-74
lines changed

9 files changed

+129
-74
lines changed

include/scale/detail/collections.hpp

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,8 @@ namespace scale {
3535
* @param encoder The encoder instance to write to.
3636
*/
3737
void encode(DynamicCollection auto &&collection, ScaleEncoder auto &encoder)
38-
requires NoTagged<decltype(collection)>
39-
and (not std::same_as<std::remove_cvref_t<decltype(collection)>,
40-
std::vector<bool>>)
38+
requires(not std::same_as<std::remove_cvref_t<decltype(collection)>,
39+
std::vector<bool>>)
4140
{
4241
encode(as_compact(collection.size()), encoder);
4342
for (auto &&item : std::forward<decltype(collection)>(collection)) {
@@ -51,8 +50,7 @@ namespace scale {
5150
* @param encoder The encoder instance to write to.
5251
*/
5352
void encode(StaticCollection auto &&collection, ScaleEncoder auto &encoder)
54-
requires NoTagged<decltype(collection)>
55-
and (not DecomposableArray<decltype(collection)>)
53+
requires(not DecomposableArray<decltype(collection)>)
5654
{
5755
for (auto &&item : std::forward<decltype(collection)>(collection)) {
5856
encode(item, encoder);
@@ -64,9 +62,7 @@ namespace scale {
6462
* @param view The string view to encode.
6563
* @param encoder The encoder instance to write to.
6664
*/
67-
void encode(const std::string_view view, ScaleEncoder auto &encoder)
68-
requires NoTagged<decltype(view)>
69-
{
65+
void encode(const std::string_view view, ScaleEncoder auto &encoder) {
7066
encode(as_compact(view.size()), encoder);
7167
encoder.write(
7268
{reinterpret_cast<const uint8_t *>(view.data()), view.size()});
@@ -79,9 +75,7 @@ namespace scale {
7975
*/
8076
template <typename T>
8177
requires std::same_as<std::remove_cvref_t<T>, std::vector<bool>>
82-
void encode(T &&vector, ScaleEncoder auto &encoder)
83-
requires NoTagged<decltype(vector)>
84-
{
78+
void encode(T &&vector, ScaleEncoder auto &encoder) {
8579
encode(as_compact(vector.size()), encoder);
8680
for (const bool item : vector) {
8781
encoder.put(static_cast<uint8_t>(item ? 1 : 0));
@@ -100,8 +94,7 @@ namespace scale {
10094
* @param decoder The decoder instance to read from.
10195
*/
10296
void decode(StaticCollection auto &collection, ScaleDecoder auto &decoder)
103-
requires NoTagged<decltype(collection)>
104-
and (not Decomposable<decltype(collection)>)
97+
requires(not Decomposable<decltype(collection)>)
10598
{
10699
for (auto &item : collection) {
107100
decode(item, decoder);
@@ -114,9 +107,7 @@ namespace scale {
114107
* @param decoder The decoder instance to read from.
115108
*/
116109
void decode(ExtensibleBackCollection auto &collection,
117-
ScaleDecoder auto &decoder)
118-
requires NoTagged<decltype(collection)>
119-
{
110+
ScaleDecoder auto &decoder) {
120111
using size_type = typename std::decay_t<decltype(collection)>::size_type;
121112

122113
size_t item_count;
@@ -143,9 +134,8 @@ namespace scale {
143134
* @param collection The collection to decode.
144135
* @param decoder The decoder instance to read from.
145136
*/
146-
void decode(ResizeableCollection auto &collection, ScaleDecoder auto &decoder)
147-
requires NoTagged<decltype(collection)>
148-
{
137+
void decode(ResizeableCollection auto &collection,
138+
ScaleDecoder auto &decoder) {
149139
size_t item_count;
150140
decode(as_compact(item_count), decoder);
151141
if (item_count > collection.max_size()) {
@@ -169,9 +159,7 @@ namespace scale {
169159
* but each element can be emplaced while decoding
170160
*/
171161
void decode(RandomExtensibleCollection auto &collection,
172-
ScaleDecoder auto &decoder)
173-
requires NoTagged<decltype(collection)>
174-
{
162+
ScaleDecoder auto &decoder) {
175163
using size_type = typename std::decay_t<decltype(collection)>::size_type;
176164
using value_type = typename std::decay_t<decltype(collection)>::value_type;
177165

include/scale/detail/decomposable.hpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,7 @@ namespace scale {
7878
* @tparam decomposable The decomposable type to encode.
7979
* @param encoder The encoder instance to write to.
8080
*/
81-
void encode(Decomposable auto &&decomposable, ScaleEncoder auto &encoder)
82-
requires NoTagged<decltype(decomposable)>
83-
{
81+
void encode(Decomposable auto &&decomposable, ScaleEncoder auto &encoder) {
8482
decompose_and_apply(std::forward<decltype(decomposable)>(decomposable),
8583
[&](auto &...args) { (encode(args, encoder), ...); });
8684
}
@@ -90,9 +88,7 @@ namespace scale {
9088
* @tparam decomposable The decomposable type to decode.
9189
* @param decoder The decoder instance to read from.
9290
*/
93-
void decode(Decomposable auto &decomposable, ScaleDecoder auto &decoder)
94-
requires NoTagged<decltype(decomposable)>
95-
{
91+
void decode(Decomposable auto &decomposable, ScaleDecoder auto &decoder) {
9692
return decompose_and_apply(decomposable, [&](auto &...args) {
9793
(decode(const_cast<std::remove_cvref_t<decltype(args)> &>(args), decoder),
9894
...);

include/scale/detail/enum.hpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,7 @@ namespace scale {
123123
* @param enumeration The enumeration value to encode.
124124
* @param encoder SCALE encoder.
125125
*/
126-
void encode(const Enumeration auto &enumeration, ScaleEncoder auto &encoder)
127-
requires NoTagged<decltype(enumeration)>
128-
{
126+
void encode(const Enumeration auto &enumeration, ScaleEncoder auto &encoder) {
129127
using T =
130128
std::underlying_type_t<std::remove_cvref_t<decltype(enumeration)>>;
131129
encode(static_cast<T>(enumeration), encoder);
@@ -136,9 +134,7 @@ namespace scale {
136134
* @param v The enumeration value to decode into.
137135
* @param decoder SCALE decoder.
138136
*/
139-
void decode(Enumeration auto &v, ScaleDecoder auto &decoder)
140-
requires NoTagged<decltype(v)>
141-
{
137+
void decode(Enumeration auto &v, ScaleDecoder auto &decoder) {
142138
using E = std::decay_t<decltype(v)>;
143139
std::underlying_type_t<E> value;
144140
decoder >> value;

include/scale/detail/fixed_width_integer.hpp

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,7 @@ namespace scale {
102102
* @param boolean Boolean value to encode.
103103
* @param encoder SCALE encoder.
104104
*/
105-
void encode(bool boolean, ScaleEncoder auto &encoder)
106-
requires NoTagged<decltype(boolean)>
107-
{
105+
void encode(bool boolean, ScaleEncoder auto &encoder) {
108106
encoder.put(boolean ? 1u : 0u);
109107
}
110108

@@ -131,9 +129,7 @@ namespace scale {
131129
* @param integer Integer value to encode.
132130
* @param encoder SCALE encoder.
133131
*/
134-
void encode(const SmallInteger auto &integer, ScaleEncoder auto &encoder)
135-
requires NoTagged<decltype(integer)>
136-
{
132+
void encode(const SmallInteger auto &integer, ScaleEncoder auto &encoder) {
137133
using Integer = std::remove_cvref_t<decltype(integer)>;
138134
if constexpr (sizeof(Integer) == 1u) {
139135
return encoder.put(static_cast<uint8_t>(integer));
@@ -151,9 +147,7 @@ namespace scale {
151147
* @param integer Big integer to encode.
152148
* @param encoder SCALE encoder.
153149
*/
154-
void encode(BigInteger auto &&integer, ScaleEncoder auto &encoder)
155-
requires NoTagged<decltype(integer)>
156-
{
150+
void encode(BigInteger auto &&integer, ScaleEncoder auto &encoder) {
157151
constexpr auto size =
158152
(std::numeric_limits<std::decay_t<decltype(integer)>>::digits + 1) / 8;
159153
// NOLINTNEXTLINE(*-pro-type-member-init)

include/scale/detail/optional.hpp

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,7 @@ namespace scale {
113113
* @param opt_bool The `optional<bool>` to encode.
114114
* @param encoder The SCALE encoder.
115115
*/
116-
void encode(OptionalBool auto &&opt_bool, ScaleEncoder auto &encoder)
117-
requires NoTagged<decltype(opt_bool)>
118-
{
116+
void encode(OptionalBool auto &&opt_bool, ScaleEncoder auto &encoder) {
119117
if (opt_bool.has_value()) {
120118
encoder.put(static_cast<uint8_t>(opt_bool.value() ? 1 // True
121119
: 2 // False
@@ -131,9 +129,7 @@ namespace scale {
131129
* @param optional The optional value to encode.
132130
* @param encoder The SCALE encoder.
133131
*/
134-
void encode(Optional auto &&optional, ScaleEncoder auto &encoder)
135-
requires NoTagged<decltype(optional)>
136-
{
132+
void encode(Optional auto &&optional, ScaleEncoder auto &encoder) {
137133
if (not optional.has_value()) {
138134
encoder.put(0);
139135
} else {
@@ -152,9 +148,7 @@ namespace scale {
152148
* @param opt_bool The `optional<bool>` to decode.
153149
* @param decoder The SCALE decoder.
154150
*/
155-
void decode(OptionalBool auto &&opt_bool, ScaleDecoder auto &decoder)
156-
requires NoTagged<decltype(opt_bool)>
157-
{
151+
void decode(OptionalBool auto &&opt_bool, ScaleDecoder auto &decoder) {
158152
auto byte = decoder.take();
159153
switch (byte) {
160154
case 0:
@@ -177,9 +171,7 @@ namespace scale {
177171
* @param optional The optional value to decode.
178172
* @param decoder The SCALE decoder.
179173
*/
180-
void decode(Optional auto &&optional, ScaleDecoder auto &decoder)
181-
requires NoTagged<decltype(optional)>
182-
{
174+
void decode(Optional auto &&optional, ScaleDecoder auto &decoder) {
183175
auto byte = decoder.take();
184176
switch (byte) {
185177
case 0:

include/scale/detail/smart_pointers.hpp

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,7 @@ namespace scale {
4646
* @throws EncodeError::DEREF_NULLPOINTER if the pointer is null.
4747
*/
4848
template <typename T>
49-
void encode(const std::shared_ptr<T> &sptr, ScaleEncoder auto &encoder)
50-
requires NoTagged<decltype(sptr)>
51-
{
49+
void encode(const std::shared_ptr<T> &sptr, ScaleEncoder auto &encoder) {
5250
if (sptr) {
5351
return encode(*sptr, encoder);
5452
}
@@ -63,9 +61,7 @@ namespace scale {
6361
* @throws EncodeError::DEREF_NULLPOINTER if the pointer is null.
6462
*/
6563
template <typename T>
66-
void encode(const std::unique_ptr<T> &uptr, ScaleEncoder auto &encoder)
67-
requires NoTagged<decltype(uptr)>
68-
{
64+
void encode(const std::unique_ptr<T> &uptr, ScaleEncoder auto &encoder) {
6965
if (uptr) {
7066
return encode(*uptr, encoder);
7167
}
@@ -80,9 +76,7 @@ namespace scale {
8076
*/
8177
template <typename T>
8278
void encode(const std::reference_wrapper<T> &reference,
83-
ScaleEncoder auto &encoder)
84-
requires NoTagged<decltype(reference)>
85-
{
79+
ScaleEncoder auto &encoder) {
8680
encode(reference.get(), encoder);
8781
}
8882

@@ -120,9 +114,8 @@ namespace scale {
120114
* @param decoder SCALE decoder.
121115
*/
122116
template <typename T>
123-
void decode(std::reference_wrapper<T> &reference, ScaleDecoder auto &decoder)
124-
requires NoTagged<decltype(reference)>
125-
{
117+
void decode(std::reference_wrapper<T> &reference,
118+
ScaleDecoder auto &decoder) {
126119
decode(reference.get(), decoder);
127120
}
128121

include/scale/scale.hpp

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44
* SPDX-License-Identifier: Apache-2.0
55
*/
66

7+
/**
8+
* @brief Combines all headers to use existing or build custom SCALE
9+
* serialization and deserialization mechanisms
10+
*/
11+
712
#pragma once
813

914
#include <qtils/outcome.hpp>
@@ -24,12 +29,29 @@
2429
#include <scale/detail/smart_pointers.hpp>
2530
#include <scale/detail/variant.hpp>
2631

32+
/**
33+
* @brief Provides implementations for SCALE encoding and decoding.
34+
*
35+
* This file defines the memory-based SCALE serialization and deserialization
36+
* mechanisms using the Outcome result type to handle errors gracefully.
37+
*/
38+
2739
namespace scale::impl {
2840

29-
// Well done implementation using outcome::result and data in memory
41+
/**
42+
* @namespace memory
43+
* @brief Memory-based implementation of SCALE encoding and decoding.
44+
*/
3045
namespace memory {
3146
using Encoder = Encoder<backend::ToBytes>;
3247

48+
/**
49+
* @brief Encodes a value using SCALE encoding.
50+
*
51+
* @tparam T The type of the value to encode.
52+
* @param value The value to encode.
53+
* @return A result containing the encoded byte vector or an error.
54+
*/
3355
template <typename T>
3456
outcome::result<std::vector<uint8_t>> encode(T &&value) {
3557
Encoder encoder;
@@ -43,6 +65,13 @@ namespace scale::impl {
4365

4466
using Decoder = Decoder<backend::FromBytes>;
4567

68+
/**
69+
* @brief Decodes a value using SCALE decoding.
70+
*
71+
* @tparam T The type of the value to decode.
72+
* @param bytes The byte span containing encoded data.
73+
* @return A result containing the decoded value or an error.
74+
*/
4675
template <typename T>
4776
outcome::result<T> decode(ConstSpanOfBytes bytes) {
4877
Decoder decoder{bytes};

include/scale/types.hpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,8 @@
2121
#include <type_traits>
2222
#include <vector>
2323

24-
#include <qtils/tagged.hpp>
25-
2624
namespace scale {
2725

28-
/// @brief Concept that ensures a type is not tagged.
29-
template <typename T>
30-
concept NoTagged = not qtils::is_tagged_v<T>;
31-
3226
// Encoding components
3327

3428
/**

0 commit comments

Comments
 (0)