Lil cleanup

This commit is contained in:
Joshua Ashton 2023-01-18 21:28:26 +00:00
parent 11d3111ec1
commit a47d6e57a9
2 changed files with 107 additions and 8 deletions

View File

@ -29,6 +29,12 @@ namespace orange::stream
return Parse<T>(first, first + length);
}
template <typename T>
Result<T> Parse(StringView view)
{
return Parse<T>(view.data, view.size);
}
template <typename T>
Result<T> 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 <typename OutArray = SmallVector<char, 1>>

View File

@ -82,6 +82,16 @@ namespace orange::kv
template <typename T>
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<int64_t>() = 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<int64_t>(m_str);
default:
return 0;
}
}
template <>
inline int32_t KeyValuesVariant::Get() const
{
return Get<int64_t>();
}
template <>
inline float KeyValuesVariant::Get() const
{
switch (m_type)
{
case Types::String:
return *stream::Parse<float>(m_str);
default:
return 0;
}
}
template <>
inline KeyValues& KeyValuesVariant::Get() const
{
@ -292,4 +334,41 @@ namespace orange::kv
return Get<const kv::KeyValues&>()[string];
}
KeyValuesVariant::operator StringView()
{
return Get<StringView>();
}
KeyValuesVariant::operator int64_t()
{
return Get<int64_t>();
}
KeyValuesVariant::operator int32_t()
{
return Get<int32_t>();
}
KeyValuesVariant::operator float()
{
return Get<float>();
}
KeyValuesVariant::operator double()
{
return Get<double>();
}
KeyValuesVariant::operator void*()
{
return Get<void*>();
}
KeyValuesVariant::operator RGBAColor32()
{
return Get<RGBAColor32>();
}
KeyValuesVariant::operator uint32_t()
{
return Get<uint32_t>();
}
KeyValuesVariant::operator uint64_t()
{
return Get<uint64_t>();
}
}