util/TemplateString: rewrite as constexpr functions

Hooray C++17!
This commit is contained in:
Max Kellermann
2020-10-23 12:06:39 +02:00
committed by Max Kellermann
parent e7c4e87ac4
commit 02314ac7dd
4 changed files with 89 additions and 87 deletions

View File

@@ -103,7 +103,7 @@ public:
template<typename T>
AppendMessageIter &AppendEmptyArray() {
return AppendMessageIter(*this, DBUS_TYPE_ARRAY,
T::TypeAsString::value)
T::as_string.value)
.CloseContainer(*this);
}
@@ -120,7 +120,7 @@ public:
AppendMessageIter &AppendVariant(const T &value) {
typedef VariantTypeTraits Traits;
return AppendMessageIter(*this, Traits::TYPE,
Traits::TypeAsString::value)
Traits::as_string.value)
.Append(value)
.CloseContainer(*this);
}
@@ -146,7 +146,7 @@ public:
typedef typename W::ContainedTraits ContainedTraits;
return AppendMessageIter(*this, Traits::TYPE,
ContainedTraits::TypeAsString::value)
ContainedTraits::as_string.value)
.Append(value.value)
.CloseContainer(*this);
}
@@ -158,7 +158,7 @@ public:
typedef typename W::ContainedTraits ContainedTraits;
return AppendMessageIter(*this, Traits::TYPE,
ContainedTraits::TypeAsString::value)
ContainedTraits::as_string.value)
.AppendFixedArray(value.value)
.CloseContainer(*this);
}

View File

@@ -42,7 +42,7 @@ namespace ODBus {
template<int type>
struct BasicTypeTraits {
static constexpr int TYPE = type;
using TypeAsString = TemplateString::CharAsString<TYPE>;
static constexpr auto as_string = TemplateString::CharAsString(TYPE);
};
template<typename T>
@@ -73,20 +73,20 @@ struct ArrayTypeTraits {
using ContainedTraits = T;
static constexpr int TYPE = DBUS_TYPE_ARRAY;
using TypeAsString =
TemplateString::InsertBefore<TYPE,
typename ContainedTraits::TypeAsString>;
static constexpr auto as_string =
TemplateString::Concat(TemplateString::CharAsString(TYPE),
ContainedTraits::as_string);
};
template<typename KeyT, typename ValueT>
struct DictEntryTypeTraits {
static constexpr int TYPE = DBUS_TYPE_DICT_ENTRY;
using TypeAsString =
TemplateString::Concat<TemplateString::CharAsString<DBUS_DICT_ENTRY_BEGIN_CHAR>,
typename KeyT::TypeAsString,
typename ValueT::TypeAsString,
TemplateString::CharAsString<DBUS_DICT_ENTRY_END_CHAR>>;
static constexpr auto as_string =
TemplateString::Concat(TemplateString::CharAsString(DBUS_DICT_ENTRY_BEGIN_CHAR),
KeyT::as_string,
ValueT::as_string,
TemplateString::CharAsString(DBUS_DICT_ENTRY_END_CHAR));
};
using VariantTypeTraits = BasicTypeTraits<DBUS_TYPE_VARIANT>;
@@ -95,21 +95,25 @@ using VariantTypeTraits = BasicTypeTraits<DBUS_TYPE_VARIANT>;
* Concatenate all TypeAsString members to one string.
*/
template<typename T, typename... ContainedTraits>
struct ConcatTypeAsString
: TemplateString::Concat<typename T::TypeAsString,
ConcatTypeAsString<ContainedTraits...>> {};
struct ConcatTypeAsString {
static constexpr auto as_string =
TemplateString::Concat(T::as_string,
ConcatTypeAsString<ContainedTraits...>::as_string);
};
template<typename T>
struct ConcatTypeAsString<T> : T::TypeAsString {};
struct ConcatTypeAsString<T> {
static constexpr auto as_string = T::as_string;
};
template<typename... ContainedTraits>
struct StructTypeTraits {
static constexpr int TYPE = DBUS_TYPE_STRUCT;
using TypeAsString =
TemplateString::Concat<TemplateString::CharAsString<DBUS_STRUCT_BEGIN_CHAR>,
ConcatTypeAsString<ContainedTraits...>,
TemplateString::CharAsString<DBUS_STRUCT_END_CHAR>>;
static constexpr auto as_string =
TemplateString::Concat(TemplateString::CharAsString(DBUS_STRUCT_BEGIN_CHAR),
ConcatTypeAsString<ContainedTraits...>::as_string,
TemplateString::CharAsString(DBUS_STRUCT_END_CHAR));
};
} /* namespace ODBus */