diff --git a/include/Orange/Core/Parse.h b/include/Orange/Core/Parse.h index bfe1360..69798df 100644 --- a/include/Orange/Core/Parse.h +++ b/include/Orange/Core/Parse.h @@ -29,6 +29,12 @@ namespace orange::stream return Parse(first, first + length); } + template + Result Parse(StringView view) + { + return Parse(view.data, view.size); + } + template Result Parse(const char*& first) { @@ -63,14 +69,28 @@ namespace orange::stream return count; } + static constexpr const char* WhitespaceDelimiters = " \t"; + static constexpr const char* NewlineDelimiters = "\r\n"; + static constexpr const char* WhitespaceOrNewlineDelimiters = " \t\r\n"; + inline size_t ConsumeSpace(const char*& first, const char* end) { - return Consume(first, end, " \t"); + return Consume(first, end, WhitespaceDelimiters); } inline size_t ConsumeSpaceAndNewLine(const char*& first, const char* end) { - return Consume(first, end, " \t\r\n"); + return Consume(first, end, WhitespaceOrNewlineDelimiters); + } + + inline bool IsWhitespace(char val) + { + return val == ' ' || val == '\t'; + } + + inline bool IsNewLine(char val) + { + return val == '\r' || val == '\n'; } template > diff --git a/include/Orange/Formats/KeyValues.h b/include/Orange/Formats/KeyValues.h index 6a066cf..48aa5e7 100644 --- a/include/Orange/Formats/KeyValues.h +++ b/include/Orange/Formats/KeyValues.h @@ -82,6 +82,16 @@ namespace orange::kv template T Get() const; + operator StringView(); + operator int64_t(); + operator int32_t(); + operator float(); + operator double(); + operator void*(); + operator RGBAColor32(); + operator uint32_t(); + operator uint64_t(); + void Set(const std::string& val) { Clear(); m_type = Types::String; m_str = KeyValuesString{ StringView{ val } }; } void Set(StringView val) { Clear(); m_type = Types::String; m_str = KeyValuesString{ val }; } void Set(int32_t val) { Clear(); m_type = Types::Int; m_data.Get() = val; } @@ -190,17 +200,15 @@ namespace orange::kv { if (stream::IsCPPComment(range, start)) { - stream::AdvancePast(start, end, "\r\n"); + stream::AdvancePast(start, end, stream::NewlineDelimiters); stream::ConsumeSpaceAndNewLine(start, end); continue; } if (*start == '{') { - fprintf(stdout, "Adding block child: %s - {\n", key.c_str()); auto child = ParseChild(start, end); kv->m_children.emplace(key, Move(child)); - fprintf(stdout, "Adding block child: }\n"); fillingInValue = false; key.clear(); @@ -213,18 +221,17 @@ namespace orange::kv break; } - if (*start == ' ' || *start == '\t' || *start == '\n' || *start == '\r') + if (stream::IsWhitespace(*start) || stream::IsNewLine(*start)) { fillingInValue = !fillingInValue; if (!fillingInValue) { - fprintf(stdout, "Adding child: %s - %s\n", key.c_str(), value.c_str()); kv->m_children.emplace(key, value); key.clear(); value.clear(); } - else if (*start == '\n' || *start == '\r') + else if (stream::IsNewLine(*start)) { fillingInValue = false; } @@ -260,6 +267,41 @@ namespace orange::kv } } + // todo josh: + // make the ::Get variant return a result + // return un-resulted version of that with the + // operators + + template <> + inline int64_t KeyValuesVariant::Get() const + { + switch (m_type) + { + case Types::String: + return *stream::Parse(m_str); + default: + return 0; + } + } + + template <> + inline int32_t KeyValuesVariant::Get() const + { + return Get(); + } + + template <> + inline float KeyValuesVariant::Get() const + { + switch (m_type) + { + case Types::String: + return *stream::Parse(m_str); + default: + return 0; + } + } + template <> inline KeyValues& KeyValuesVariant::Get() const { @@ -292,4 +334,41 @@ namespace orange::kv return Get()[string]; } + + KeyValuesVariant::operator StringView() + { + return Get(); + } + KeyValuesVariant::operator int64_t() + { + return Get(); + } + KeyValuesVariant::operator int32_t() + { + return Get(); + } + KeyValuesVariant::operator float() + { + return Get(); + } + KeyValuesVariant::operator double() + { + return Get(); + } + KeyValuesVariant::operator void*() + { + return Get(); + } + KeyValuesVariant::operator RGBAColor32() + { + return Get(); + } + KeyValuesVariant::operator uint32_t() + { + return Get(); + } + KeyValuesVariant::operator uint64_t() + { + return Get(); + } }