summaryrefslogtreecommitdiff
path: root/modules/codec/c++
diff options
context:
space:
mode:
Diffstat (limited to 'modules/codec/c++')
-rw-r--r--modules/codec/c++/base64.hpp8
-rw-r--r--modules/codec/c++/csv.hpp6
-rw-r--r--modules/codec/c++/data.hpp194
-rw-r--r--modules/codec/c++/schema_meta.hpp6
-rw-r--r--modules/codec/c++/simple.hpp12
5 files changed, 111 insertions, 115 deletions
diff --git a/modules/codec/c++/base64.hpp b/modules/codec/c++/base64.hpp
index 141a63d..ce9d4ce 100644
--- a/modules/codec/c++/base64.hpp
+++ b/modules/codec/c++/base64.hpp
@@ -71,8 +71,8 @@ public:
std::string b64_str;
try {
- uint64_t unpadded_len = (from.size() * 4u + 2u) / 3u;
- uint64_t padded_len = ( unpadded_len + 3u ) & ~3u;
+ uint64_t unpadded_len = (from.size() * 4u + 2u).get() / 3u;
+ uint64_t padded_len = (unpadded_len + 3u) & ~3u;
b64_str.resize(padded_len);
}catch(const std::exception&){
return make_error<err::out_of_memory>();
@@ -81,8 +81,8 @@ public:
uint64_t j{0u}, k{0u};
std::array<uint8_t,3> s{};
- for(uint64_t i = 0u; i < from.size(); ++i){
- s[j] = from.at(i);
+ for(data<schema::UInt64> i = 0u; i < from.size(); ++i){
+ s[j] = from.at(i.get());
++j;
if(j==3){
b64_str.at(k) = impl::base64_char_map.at((s[0u] & 0xFC) >> 2);
diff --git a/modules/codec/c++/csv.hpp b/modules/codec/c++/csv.hpp
index 240ed75..0d76372 100644
--- a/modules/codec/c++/csv.hpp
+++ b/modules/codec/c++/csv.hpp
@@ -50,7 +50,7 @@ struct csv_encode<schema::Array<T,Dim>, FromDecode> {
}
}
- for(std::size_t i = 0; i < from.size(); ++i){
+ for(data<schema::UInt64> i = 0; i < from.size(); ++i){
auto eov = csv_encode<T,FromDecode>::encode(from.at(i), to);
if(eov.is_error()){
return eov;
@@ -166,8 +166,8 @@ struct csv_encode<schema::String, FromDecode> {
using Schema = schema::String;
static error_or<void> encode(const data<Schema, FromDecode>& from, buffer& to){
- for(size_t i = 0; i < from.size(); ++i){
- auto eov = stream_value<schema::Int8>::encode(from.at(i), to);
+ for(data<schema::UInt64> i = 0; i < from.size(); ++i){
+ auto eov = stream_value<schema::Int8>::encode(from.at(i.get()), to);
if(eov.is_error()){
return eov;
}
diff --git a/modules/codec/c++/data.hpp b/modules/codec/c++/data.hpp
index 75c611c..01eddb6 100644
--- a/modules/codec/c++/data.hpp
+++ b/modules/codec/c++/data.hpp
@@ -167,6 +167,11 @@ public:
return {get() - rhs.get()};
}
+ data<Schema, encode::Native>& operator++() {
+ set(get() + static_cast<typename native_data_type<Schema>::type>(1));
+ return *this;
+ }
+
template<typename Enc>
bool operator==(const data<Schema, Enc>& rhs)const{
return get() == rhs.get();
@@ -271,6 +276,74 @@ public:
}
};
+template<typename T, uint64_t... D>
+class data<schema::FixedArray<T,D...>, encode::Native> {
+public:
+ using Schema = schema::FixedArray<T,D...>;
+ using MetaSchema = typename meta_schema<Schema>::MetaSchema;
+private:
+ //using inner_type = std::array<data<T, encode::Native>, multiply_helper<Dims...>::value>;
+ //std::unique_ptr<inner_type> value_;
+ using ArrayT = std::array<data<T, encode::Native>, ct_multiply<uint64_t, D...>::value>;
+ ArrayT value_;
+
+public:
+ data() = default;
+ data(data<MetaSchema, encode::Native>){}
+ data(const std::array<data<T, encode::Native>, ct_multiply<uint64_t,D...>::value>& value__):
+ value_{value__}
+ {}
+
+ data<T, encode::Native>& at(const std::array<uint64_t, sizeof...(D)>& ind){
+ return value_.at(this->get_flat_index(ind));
+ }
+
+ const data<T, encode::Native>& at(const std::array<uint64_t, sizeof...(D)>& ind) const {
+ return value_.at(this->get_flat_index(ind));
+ }
+
+ data<T, encode::Native>& at(data<schema::UInt64, encode::Native> i) {
+ return value_.at(this->get_flat_index({i.get()}));
+ }
+
+ const data<T, encode::Native>& at(data<schema::UInt64, encode::Native> i) const {
+ return value_.at(this->get_flat_index({i.get()}));
+ }
+
+ data<T, encode::Native>& at(const data<schema::FixedArray<schema::UInt64, sizeof...(D)>>& i){
+ return value_.at(this->get_flat_index(i));
+ }
+
+ const data<T, encode::Native>& at(const data<schema::FixedArray<schema::UInt64, sizeof...(D)>>& i)const{
+ return value_.at(this->get_flat_index(i));
+ }
+
+ template<uint64_t i>
+ uint64_t get_dim_size() const {
+ return parameter_pack_value<i, uint64_t, D...>::value;
+ }
+
+ data<schema::FixedArray<schema::UInt64, sizeof...(D)>> get_dims() const {
+ return {std::array<uint64_t, sizeof...(D)>{D...}};
+ }
+private:
+ uint64_t get_flat_index(const std::array<uint64_t, sizeof...(D)>& i) const {
+ uint64_t s = 0;
+
+ uint64_t stride = 1;
+
+ constexpr static std::array<uint64_t, sizeof...(D)> dims_{D...};
+
+ for(uint64_t iter = 0; iter < sizeof...(D); ++iter){
+ assert(i.at(iter) < dims_.at(iter));
+ s += i.at(iter) * stride;
+ stride *= dims_.at(iter);
+ }
+
+ return s;
+ }
+};
+
/*
template<typename T, typename N>
class data<schema::Ref<schema::Primitive<T,N>>, encode::Native {
@@ -427,7 +500,7 @@ public:
/**
* Return the amount of members.
*/
- constexpr size_t size() const {
+ constexpr uint64_t size() const {
return sizeof...(T);
}
};
@@ -474,7 +547,7 @@ public:
return std::get<i>(value_);
}
- constexpr size_t size() const {
+ constexpr uint64_t size() const {
return sizeof...(T);
}
};
@@ -609,15 +682,17 @@ class data<schema::Array<T,Dim>, encode::Native> {
const data<T, encode::Native>& at(const std::array<uint64_t, Dim>& ind) const {
return value_.at(this->get_flat_index(ind));
}
-
- template<std::integral... Dims>
- data<T, encode::Native>& at(Dims... i){
- return value_.at(this->get_flat_index(std::array<uint64_t, Dim>{static_cast<uint64_t>(i)...}));
- }
- template<std::integral... Dims>
- const data<T, encode::Native>& at(Dims... i) const {
- return value_.at(this->get_flat_index(std::array<uint64_t, Dim>{static_cast<uint64_t>(i)...}));
+ data<T, encode::Native>& at(data<schema::UInt64, encode::Native> i) {
+ data<schema::FixedArray<schema::UInt64,Dim>, encode::Native> i_arr;
+ i_arr.at(0u) = i;
+ return at(i_arr);
+ }
+
+ const data<T, encode::Native>& at(data<schema::UInt64, encode::Native> i) const {
+ data<schema::FixedArray<schema::UInt64,Dim>, encode::Native> i_arr;
+ i_arr.at(0u) = i;
+ return at(i_arr);
}
data<T,encode::Native>& at(const data<schema::FixedArray<schema::UInt64,Dim>>& i){
@@ -632,7 +707,7 @@ class data<schema::Array<T,Dim>, encode::Native> {
return dims_.at(i);
}
- size_t size() const { return value_.size();}
+ data<schema::UInt64,encode::Native> size() const { return {value_.size()};}
data<schema::FixedArray<schema::UInt64, Dim>> get_dims() const {
return {dims_};
@@ -662,7 +737,7 @@ private:
static_assert(always_false<V>, "Cases exhausted");
}
}(i.at(iter));
- assert(ind < dims_.at(iter));
+ assert(ind < dims_.at({iter}));
s += ind * stride;
stride *= dims_.at(iter);
}
@@ -671,85 +746,6 @@ private:
}
};
-template<typename T, uint64_t... D>
-class data<schema::FixedArray<T,D...>, encode::Native> {
-public:
- using Schema = schema::FixedArray<T,D...>;
- using MetaSchema = typename meta_schema<Schema>::MetaSchema;
-private:
- //using inner_type = std::array<data<T, encode::Native>, multiply_helper<Dims...>::value>;
- //std::unique_ptr<inner_type> value_;
- using ArrayT = std::array<data<T, encode::Native>, ct_multiply<uint64_t, D...>::value>;
- ArrayT value_;
-
-public:
- data() = default;
- data(data<MetaSchema, encode::Native>){}
- data(const std::array<data<T, encode::Native>, ct_multiply<uint64_t,D...>::value>& value__):
- value_{value__}
- {}
-
- data<T, encode::Native>& at(const std::array<uint64_t, sizeof...(D)>& ind){
- return value_.at(this->get_flat_index(ind));
- }
-
- const data<T, encode::Native>& at(const std::array<uint64_t, sizeof...(D)>& ind) const {
- return value_.at(this->get_flat_index(ind));
- }
-
- template<typename... Sch>
- data<T, encode::Native>& at(data<Sch, encode::Native>... i) {
- return value_.at(this->get_flat_index({i...}));
- }
-
- template<typename... Sch>
- const data<T, encode::Native>& at(data<Sch, encode::Native>... i) const {
- return value_.at(this->get_flat_index({i...}));
- }
-
- template<std::integral... Dims>
- data<T, encode::Native>& at(Dims... i) {
- return value_.at(this->get_flat_index({i...}));
- }
-
- template<std::integral... Dims>
- const data<T, encode::Native>& at(Dims... i) const {
- return value_.at(this->get_flat_index({i...}));
- }
-
- data<T, encode::Native>& at(const data<schema::FixedArray<schema::UInt64, sizeof...(D)>>& i){
- return value_.at(this->get_flat_index(i));
- }
-
- const data<T, encode::Native>& at(const data<schema::FixedArray<schema::UInt64, sizeof...(D)>>& i)const{
- return value_.at(this->get_flat_index(i));
- }
-
- template<uint64_t i>
- uint64_t get_dim_size() const {
- return parameter_pack_value<i, uint64_t, D...>::value;
- }
-
- data<schema::FixedArray<schema::UInt64, sizeof...(D)>> get_dims() const {
- return {std::array<uint64_t, sizeof...(D)>{D...}};
- }
-private:
- uint64_t get_flat_index(const std::array<uint64_t, sizeof...(D)>& i) const {
- uint64_t s = 0;
-
- uint64_t stride = 1;
-
- constexpr static std::array<uint64_t, sizeof...(D)> dims_{D...};
-
- for(uint64_t iter = 0; iter < sizeof...(D); ++iter){
- assert(i.at(iter) < dims_.at(iter));
- s += i.at(iter) * stride;
- stride *= dims_.at(iter);
- }
-
- return s;
- }
-};
/**
* Data type representing string.
@@ -781,8 +777,8 @@ public:
/**
* Return the length of the string.
*/
- std::size_t size() const {
- return value_.size();
+ data<schema::UInt64, encode::Native> size() const {
+ return {value_.size()};
}
/**
@@ -795,22 +791,22 @@ public:
/**
* Get a char reference at position i.
*/
- char& at(size_t i) {
+ char& at(uint64_t i) {
return value_.at(i);
}
/**
* Get a char reference at position i.
*/
- const char& at(size_t i) const {
+ const char& at(uint64_t i) const {
return value_.at(i);
}
- char get_at(size_t i) const{
+ char get_at(uint64_t i) const{
return value_.at(i);
}
- void set_at(size_t i, char val){
+ void set_at(uint64_t i, char val){
value_.at(i) = val;
}
@@ -828,8 +824,8 @@ public:
return false;
}
bool eq = true;
- for(uint64_t i = 0; i < size(); ++i){
- eq = eq && (get_at(i) == rhs.get_at(i));
+ for(data<schema::UInt64, encode::Native> i = 0; i < size(); ++i){
+ eq = eq && (get_at(i.get()) == rhs.get_at(i.get()));
}
return eq;
}
diff --git a/modules/codec/c++/schema_meta.hpp b/modules/codec/c++/schema_meta.hpp
index 80b6686..659250c 100644
--- a/modules/codec/c++/schema_meta.hpp
+++ b/modules/codec/c++/schema_meta.hpp
@@ -78,9 +78,9 @@ struct meta_schema<schema::Array<T,Dim>> {
using Schema = schema::Array<T,Dim>;
};
-template<typename T, uint64_t Dim>
-struct meta_schema<schema::FixedArray<T,Dim>> {
+template<typename T, uint64_t... Dim>
+struct meta_schema<schema::FixedArray<T,Dim...>> {
using MetaSchema = schema::Void;
- using Schema = schema::FixedArray<T,Dim>;
+ using Schema = schema::FixedArray<T,Dim...>;
};
}
diff --git a/modules/codec/c++/simple.hpp b/modules/codec/c++/simple.hpp
index 33831b6..4990578 100644
--- a/modules/codec/c++/simple.hpp
+++ b/modules/codec/c++/simple.hpp
@@ -169,7 +169,7 @@ template<typename FromEnc>
struct kelsimple_encode<schema::String, FromEnc> {
static error_or<void> encode(const data<schema::String, FromEnc>& from, buffer& to){
const auto str_size = from.size();
- typename native_data_type<schema::UInt64>::type str_len = static_cast<uint64_t>(str_size);
+ typename native_data_type<schema::UInt64>::type str_len = static_cast<uint64_t>(str_size.get());
{
auto eov = stream_value<schema::UInt64>::encode(str_len, to);
if(eov.is_error()){
@@ -177,8 +177,8 @@ struct kelsimple_encode<schema::String, FromEnc> {
}
}
- for(std::size_t i = 0; i < str_size; ++i){
- auto eov = stream_value<schema::Int8>::encode(from.at(i), to);
+ for(data<schema::UInt64> i = 0; i < str_size; ++i){
+ auto eov = stream_value<schema::Int8>::encode(from.at(i.get()), to);
if(eov.is_error()){
return eov;
}
@@ -344,14 +344,14 @@ struct kelsimple_decode<schema::String, FromEnc> {
}
to = data<schema::String,FromEnc>{val};
}
- const std::size_t str_size = to.size();
- for(std::size_t i = 0; i < str_size; ++i){
+ const data<schema::UInt64> str_size = to.size();
+ for(data<schema::UInt64> i = 0; i < str_size; ++i){
int8_t val{};
auto eov = stream_value<schema::Int8>::decode(val, from);
if(eov.is_error()){
return eov;
}
- to.set_at(i, val);
+ to.set_at(i.get(), val);
}
return void_t{};
}