diff --git a/LibCBOR/Include/CBOR/Decoder.hpp b/LibCBOR/Include/CBOR/Decoder.hpp index a135bda..b552054 100644 --- a/LibCBOR/Include/CBOR/Decoder.hpp +++ b/LibCBOR/Include/CBOR/Decoder.hpp @@ -23,27 +23,29 @@ namespace CBOR Item(Decoder &decoder); public: - bool Bool (); - Special Special(); + bool Bool(); + Special Special(); - std::int8_t Int8 (); - std::int16_t Int16 (); - std::int32_t Int32 (); - std::int64_t Int64 (); + std::int8_t Int8(); + std::int16_t Int16(); + std::int32_t Int32(); + std::int64_t Int64(); - std::uint8_t Uint8 (); - std::uint16_t Uint16 (); - std::uint32_t Uint32 (); - std::uint64_t Uint64 (); + std::uint8_t Uint8(); + std::uint16_t Uint16(); + std::uint32_t Uint32(); + std::uint64_t Uint64(); // Note(3011): float16_t is currently not supported - float Float (); - double Double (); + float Float(); + double Double(); - class Binary Binary (); - class String String (); - class Array Array (); - class Map Map (); + std::span Binary(); + std::string_view String(); + class Binary IndefiniteBinary(); + class String IndefiniteString(); + class Array Array(); + class Map Map(); private: friend class Decoder; @@ -80,16 +82,13 @@ namespace CBOR Binary(Decoder &decoder); public: - std::span Get(); - - void AllowIndefinite(); bool Done(); std::span Next(); + private: friend class Decoder; bool mHeaderParsed; - bool mIndefiniteAllowed; bool mDone; bool mCheckedDone; Decoder *mDecoder; @@ -101,16 +100,13 @@ namespace CBOR String(Decoder &decoder); public: - std::string_view Get(); - - void AllowIndefinite(); bool Done(); std::string_view Next(); + private: friend class Decoder; bool mHeaderParsed; - bool mIndefiniteAllowed; bool mDone; bool mCheckedDone; Decoder *mDecoder; @@ -161,27 +157,29 @@ namespace CBOR public: Decoder(std::span buffer); - bool Bool (); - Special Special(); + bool Bool(); + Special Special(); - std::int8_t Int8 (); - std::int16_t Int16 (); - std::int32_t Int32 (); - std::int64_t Int64 (); + std::int8_t Int8(); + std::int16_t Int16(); + std::int32_t Int32(); + std::int64_t Int64(); - std::uint8_t Uint8 (); - std::uint16_t Uint16 (); - std::uint32_t Uint32 (); - std::uint64_t Uint64 (); + std::uint8_t Uint8(); + std::uint16_t Uint16(); + std::uint32_t Uint32(); + std::uint64_t Uint64(); // Note(3011): float16_t is currently not supported - float Float (); - double Double (); + float Float(); + double Double(); - Binary Binary (); - String String (); - Array Array (); - Map Map (); + std::span Binary(); + std::string_view String(); + class Binary IndefiniteBinary(); + class String IndefiniteString(); + class Array Array(); + class Map Map(); private: friend class Binary; diff --git a/LibCBOR/Source/Decoder.cpp b/LibCBOR/Source/Decoder.cpp index 442ee1f..8cb2ca3 100644 --- a/LibCBOR/Source/Decoder.cpp +++ b/LibCBOR/Source/Decoder.cpp @@ -139,11 +139,11 @@ namespace CBOR std::uint64_t ArgumentValue(std::uint8_t header, std::span buffer, std::size_t ¤t) { - ArgumentPosition pos = GetArgumentPosition(header); - if (std::to_underlying(pos) <= 23) { - return std::to_underlying(pos); + ArgumentPosition position = GetArgumentPosition(header); + if (std::to_underlying(position) <= 23) { + return std::to_underlying(position); } - switch (pos) { + switch (position) { case ArgumentPosition::Next1B: return Consume1B(buffer, current); case ArgumentPosition::Next2B: @@ -416,16 +416,26 @@ namespace CBOR return mDecoder->Double(); } - Binary Item::Binary() + std::span Item::Binary() { return mDecoder->Binary(); } - String Item::String() + std::string_view Item::String() { return mDecoder->String(); } + Binary Item::IndefiniteBinary() + { + return mDecoder->IndefiniteBinary(); + } + + String Item::IndefiniteString() + { + return mDecoder->IndefiniteString(); + } + Array Item::Array() { return mDecoder->Array(); @@ -462,44 +472,11 @@ namespace CBOR Binary::Binary(Decoder &decoder) : mHeaderParsed(false) - , mIndefiniteAllowed(false) , mDone(false) , mCheckedDone(false) , mDecoder(&decoder) {} - std::span Binary::Get() - { - if (mDone) { - throw InvalidUsageError("this item has already been fully parsed"); - } - - if (mIndefiniteAllowed) { - throw InvalidUsageError("indefinite-length items have been explicitly enabled, " - "use the funcions for those instead"); - } - - std::uint8_t header = Consume1B(mDecoder->mBuffer, mDecoder->mCurrent); - MajorType major = GetMajorType(header); - mHeaderParsed = true; - if (major != MajorType::Binary) { - throw TypeMismatchError("binary", ToString(major)); - } - - if (GetArgumentPosition(header) == ArgumentPosition::Indefinite) { - throw IndefiniteLengthError(); - } - - mDone = true; - std::uint64_t arg = ArgumentValue(header, mDecoder->mBuffer, mDecoder->mCurrent); - return ExtractBinary(arg, mDecoder->mBuffer, mDecoder->mCurrent); - } - - void Binary::AllowIndefinite() - { - mIndefiniteAllowed = true; - } - bool Binary::Done() { if (!mHeaderParsed) { @@ -550,8 +527,8 @@ namespace CBOR std::uint8_t header = Consume1B(mDecoder->mBuffer, mDecoder->mCurrent); MajorType major = GetMajorType(header); - ArgumentPosition pos = GetArgumentPosition(header); - if (major != MajorType::Binary || pos == ArgumentPosition::Indefinite){ + ArgumentPosition position = GetArgumentPosition(header); + if (major != MajorType::Binary || position == ArgumentPosition::Indefinite){ throw MalformedDataError("an indefinite length string may only contain " "definite length strings"); } @@ -562,44 +539,11 @@ namespace CBOR String::String(Decoder &decoder) : mHeaderParsed(false) - , mIndefiniteAllowed(false) , mDone(false) , mCheckedDone(false) , mDecoder(&decoder) {} - std::string_view String::Get() - { - if (mDone) { - throw InvalidUsageError("this item has already been fully parsed"); - } - - if (mIndefiniteAllowed) { - throw InvalidUsageError("indefinite-length items have been explicitly enabled, " - "use the funcions for those instead"); - } - - std::uint8_t header = Consume1B(mDecoder->mBuffer, mDecoder->mCurrent); - mHeaderParsed = true; - MajorType major = GetMajorType(header); - if (major != MajorType::String) { - throw TypeMismatchError("string", ToString(major)); - } - - if (GetArgumentPosition(header) == ArgumentPosition::Indefinite) { - throw IndefiniteLengthError(); - } - - mDone = true; - std::uint64_t arg = ArgumentValue(header, mDecoder->mBuffer, mDecoder->mCurrent); - return ExtractString(arg, mDecoder->mBuffer, mDecoder->mCurrent); - } - - void String::AllowIndefinite() - { - mIndefiniteAllowed = true; - } - bool String::Done() { if (!mHeaderParsed) { @@ -650,8 +594,8 @@ namespace CBOR std::uint8_t header = Consume1B(mDecoder->mBuffer, mDecoder->mCurrent); MajorType major = GetMajorType(header); - ArgumentPosition pos = GetArgumentPosition(header); - if (major != MajorType::String || pos == ArgumentPosition::Indefinite){ + ArgumentPosition position = GetArgumentPosition(header); + if (major != MajorType::String || position == ArgumentPosition::Indefinite){ throw MalformedDataError("an indefinite length string may only contain " "definite length strings"); } @@ -902,12 +846,44 @@ namespace CBOR throw TypeMismatchError("double", ToString(major)); } - Binary Decoder::Binary() + std::span Decoder::Binary() + { + std::uint8_t header = Consume1B(mBuffer, mCurrent); + MajorType major = GetMajorType(header); + if (major != MajorType::Binary) { + throw TypeMismatchError("binary", ToString(major)); + } + + if (GetArgumentPosition(header) == ArgumentPosition::Indefinite) { + throw IndefiniteLengthError(); + } + + std::uint64_t arg = ArgumentValue(header, mBuffer, mCurrent); + return ExtractBinary(arg, mBuffer, mCurrent); + } + + std::string_view Decoder::String() + { + std::uint8_t header = Consume1B(mBuffer, mCurrent); + MajorType major = GetMajorType(header); + if (major != MajorType::String) { + throw TypeMismatchError("string", ToString(major)); + } + + if (GetArgumentPosition(header) == ArgumentPosition::Indefinite) { + throw IndefiniteLengthError(); + } + + std::uint64_t arg = ArgumentValue(header, mBuffer, mCurrent); + return ExtractString(arg, mBuffer, mCurrent); + } + + Binary Decoder::IndefiniteBinary() { return { *this }; } - String Decoder::String() + String Decoder::IndefiniteString() { return { *this }; } diff --git a/Tests/Main.cpp b/Tests/Main.cpp index 4dcd20e..cae2a7d 100644 --- a/Tests/Main.cpp +++ b/Tests/Main.cpp @@ -59,10 +59,10 @@ SomeStruct Decode1(std::span buffer) CBOR::Map object = dec.Map(); while (!object.Done()) { CBOR::KeyValue kv = object.Next(); - std::string_view key = kv.Key().String().Get(); + std::string_view key = kv.Key().String(); CBOR::Item value = kv.Value(); if (key == "name") { - result.name = value.String().Get(); + result.name = value.String(); } else if (key == "speed") { result.speed = value.Double(); @@ -82,7 +82,7 @@ SomeStruct Decode1(std::span buffer) else if (key == "tools") { CBOR::Array tools = value.Array(); while(!tools.Done()) { - result.tools.push_back(std::string(tools.Next().String().Get())); + result.tools.push_back(std::string(tools.Next().String())); } } } @@ -98,10 +98,10 @@ SomeStruct Decode2(std::span buffer) CBOR::Map object = dec.Map(); while (!object.Done()) { CBOR::KeyValue kv = object.Next(); - std::string_view key = kv.Key().String().Get(); + std::string_view key = kv.Key().String(); CBOR::Item value = kv.Value(); if (key == "name") { - result.name = value.String().Get(); + result.name = value.String(); } else if (key == "speed") { result.speed = value.Double(); @@ -122,8 +122,7 @@ SomeStruct Decode2(std::span buffer) CBOR::Array tools = value.Array(); while(!tools.Done()) { result.tools.push_back(""); - CBOR::String tool = tools.Next().String(); - tool.AllowIndefinite(); + CBOR::String tool = tools.Next().IndefiniteString(); while (!tool.Done()) { result.tools.back().append(tool.Next()); }