Use constexpr or inline in stringbuilder where possible
This commit is contained in:
parent
f16703ffc0
commit
eef6cd2f9e
|
@ -12,18 +12,18 @@ namespace ConversionUtilities {
|
||||||
/// \cond
|
/// \cond
|
||||||
namespace Helper {
|
namespace Helper {
|
||||||
|
|
||||||
template <class StringType, Traits::EnableIf<std::is_class<StringType>> * = nullptr> std::size_t computeTupleElementSize(const StringType *str)
|
template <class StringType, Traits::EnableIf<std::is_class<StringType>> * = nullptr> inline std::size_t computeTupleElementSize(const StringType *str)
|
||||||
{
|
{
|
||||||
return str->size();
|
return str->size();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class StringType, Traits::EnableIf<std::is_class<StringType>> * = nullptr> std::size_t computeTupleElementSize(const StringType &str)
|
template <class StringType, Traits::EnableIf<std::is_class<StringType>> * = nullptr> inline std::size_t computeTupleElementSize(const StringType &str)
|
||||||
{
|
{
|
||||||
return str.size();
|
return str.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class StringType, class CharType, Traits::EnableIf<std::is_same<typename StringType::value_type, CharType>> * = nullptr>
|
template <class StringType, class CharType, Traits::EnableIf<std::is_same<typename StringType::value_type, CharType>> * = nullptr>
|
||||||
std::size_t computeTupleElementSize(const CharType *str)
|
constexpr std::size_t computeTupleElementSize(const CharType *str)
|
||||||
{
|
{
|
||||||
return std::char_traits<CharType>::length(str);
|
return std::char_traits<CharType>::length(str);
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@ constexpr std::size_t computeTupleElementSize(CharType)
|
||||||
template <class StringType, typename IntegralType,
|
template <class StringType, typename IntegralType,
|
||||||
Traits::EnableIf<Traits::Not<std::is_same<typename StringType::value_type, IntegralType>>, std::is_integral<IntegralType>,
|
Traits::EnableIf<Traits::Not<std::is_same<typename StringType::value_type, IntegralType>>, std::is_integral<IntegralType>,
|
||||||
std::is_unsigned<IntegralType>> * = nullptr>
|
std::is_unsigned<IntegralType>> * = nullptr>
|
||||||
std::size_t computeTupleElementSize(IntegralType number, typename StringType::value_type base = 10)
|
constexpr std::size_t computeTupleElementSize(IntegralType number, typename StringType::value_type base = 10)
|
||||||
{
|
{
|
||||||
std::size_t size = 0;
|
std::size_t size = 0;
|
||||||
for (auto n = number; n; n /= base, ++size)
|
for (auto n = number; n; n /= base, ++size)
|
||||||
|
@ -48,7 +48,7 @@ std::size_t computeTupleElementSize(IntegralType number, typename StringType::va
|
||||||
template <class StringType, typename IntegralType,
|
template <class StringType, typename IntegralType,
|
||||||
Traits::EnableIf<Traits::Not<std::is_same<typename StringType::value_type, IntegralType>>, std::is_integral<IntegralType>,
|
Traits::EnableIf<Traits::Not<std::is_same<typename StringType::value_type, IntegralType>>, std::is_integral<IntegralType>,
|
||||||
std::is_signed<IntegralType>> * = nullptr>
|
std::is_signed<IntegralType>> * = nullptr>
|
||||||
std::size_t computeTupleElementSize(IntegralType number, typename StringType::value_type base = 10)
|
constexpr std::size_t computeTupleElementSize(IntegralType number, typename StringType::value_type base = 10)
|
||||||
{
|
{
|
||||||
std::size_t size = number < 0 ? 1 : 0;
|
std::size_t size = number < 0 ? 1 : 0;
|
||||||
for (auto n = number; n; n /= base, ++size)
|
for (auto n = number; n; n /= base, ++size)
|
||||||
|
@ -56,24 +56,24 @@ std::size_t computeTupleElementSize(IntegralType number, typename StringType::va
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class StringType, Traits::EnableIf<std::is_class<StringType>> * = nullptr> void append(StringType &target, const StringType *str)
|
template <class StringType, Traits::EnableIf<std::is_class<StringType>> * = nullptr> inline void append(StringType &target, const StringType *str)
|
||||||
{
|
{
|
||||||
target.append(*str);
|
target.append(*str);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class StringType, Traits::EnableIf<std::is_class<StringType>> * = nullptr> void append(StringType &target, const StringType &str)
|
template <class StringType, Traits::EnableIf<std::is_class<StringType>> * = nullptr> inline void append(StringType &target, const StringType &str)
|
||||||
{
|
{
|
||||||
target.append(str);
|
target.append(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class StringType, class CharType, Traits::EnableIf<std::is_same<typename StringType::value_type, CharType>> * = nullptr>
|
template <class StringType, class CharType, Traits::EnableIf<std::is_same<typename StringType::value_type, CharType>> * = nullptr>
|
||||||
void append(StringType &target, const CharType *str)
|
inline void append(StringType &target, const CharType *str)
|
||||||
{
|
{
|
||||||
target.append(str);
|
target.append(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class StringType, class CharType, Traits::EnableIf<std::is_same<typename StringType::value_type, CharType>> * = nullptr>
|
template <class StringType, class CharType, Traits::EnableIf<std::is_same<typename StringType::value_type, CharType>> * = nullptr>
|
||||||
void append(StringType &target, CharType c)
|
inline void append(StringType &target, CharType c)
|
||||||
{
|
{
|
||||||
target += c;
|
target += c;
|
||||||
}
|
}
|
||||||
|
@ -81,7 +81,7 @@ void append(StringType &target, CharType c)
|
||||||
template <class StringType, typename IntegralType,
|
template <class StringType, typename IntegralType,
|
||||||
Traits::EnableIf<Traits::Not<std::is_same<typename StringType::value_type, IntegralType>>, std::is_integral<IntegralType>,
|
Traits::EnableIf<Traits::Not<std::is_same<typename StringType::value_type, IntegralType>>, std::is_integral<IntegralType>,
|
||||||
std::is_unsigned<IntegralType>> * = nullptr>
|
std::is_unsigned<IntegralType>> * = nullptr>
|
||||||
void append(StringType &target, IntegralType number, typename StringType::value_type base = 10)
|
inline void append(StringType &target, IntegralType number, typename StringType::value_type base = 10)
|
||||||
{
|
{
|
||||||
const auto start = target.begin() + target.size();
|
const auto start = target.begin() + target.size();
|
||||||
do {
|
do {
|
||||||
|
@ -93,7 +93,7 @@ void append(StringType &target, IntegralType number, typename StringType::value_
|
||||||
template <class StringType, typename IntegralType,
|
template <class StringType, typename IntegralType,
|
||||||
Traits::EnableIf<Traits::Not<std::is_same<typename StringType::value_type, IntegralType>>, std::is_integral<IntegralType>,
|
Traits::EnableIf<Traits::Not<std::is_same<typename StringType::value_type, IntegralType>>, std::is_integral<IntegralType>,
|
||||||
std::is_signed<IntegralType>> * = nullptr>
|
std::is_signed<IntegralType>> * = nullptr>
|
||||||
void append(StringType &target, IntegralType number, typename StringType::value_type base = 10)
|
inline void append(StringType &target, IntegralType number, typename StringType::value_type base = 10)
|
||||||
{
|
{
|
||||||
if (number < 0) {
|
if (number < 0) {
|
||||||
target += '-';
|
target += '-';
|
||||||
|
@ -107,12 +107,12 @@ void append(StringType &target, IntegralType number, typename StringType::value_
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class StringType, class Tuple, std::size_t N> struct TupleToString {
|
template <class StringType, class Tuple, std::size_t N> struct TupleToString {
|
||||||
static std::size_t precomputeSize(const Tuple &tuple)
|
static inline std::size_t precomputeSize(const Tuple &tuple)
|
||||||
{
|
{
|
||||||
return TupleToString<StringType, Tuple, N - 1>::precomputeSize(tuple) + computeTupleElementSize<StringType>(std::get<N - 1>(tuple));
|
return TupleToString<StringType, Tuple, N - 1>::precomputeSize(tuple) + computeTupleElementSize<StringType>(std::get<N - 1>(tuple));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void append(const Tuple &tuple, StringType &str)
|
static inline void append(const Tuple &tuple, StringType &str)
|
||||||
{
|
{
|
||||||
TupleToString<StringType, Tuple, N - 1>::append(tuple, str);
|
TupleToString<StringType, Tuple, N - 1>::append(tuple, str);
|
||||||
Helper::append(str, std::get<N - 1>(tuple));
|
Helper::append(str, std::get<N - 1>(tuple));
|
||||||
|
@ -120,12 +120,12 @@ template <class StringType, class Tuple, std::size_t N> struct TupleToString {
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class StringType, class Tuple> struct TupleToString<StringType, Tuple, 1> {
|
template <class StringType, class Tuple> struct TupleToString<StringType, Tuple, 1> {
|
||||||
static std::size_t precomputeSize(const Tuple &tuple)
|
static inline std::size_t precomputeSize(const Tuple &tuple)
|
||||||
{
|
{
|
||||||
return computeTupleElementSize<StringType>(std::get<0>(tuple));
|
return computeTupleElementSize<StringType>(std::get<0>(tuple));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void append(const Tuple &tuple, StringType &str)
|
static inline void append(const Tuple &tuple, StringType &str)
|
||||||
{
|
{
|
||||||
Helper::append(str, std::get<0>(tuple));
|
Helper::append(str, std::get<0>(tuple));
|
||||||
}
|
}
|
||||||
|
@ -136,7 +136,7 @@ template <class StringType, class Tuple> struct TupleToString<StringType, Tuple,
|
||||||
/*!
|
/*!
|
||||||
* \brief Concatenates all strings hold by the specified \a tuple.
|
* \brief Concatenates all strings hold by the specified \a tuple.
|
||||||
*/
|
*/
|
||||||
template <class StringType = std::string, class... Args> StringType tupleToString(const std::tuple<Args...> &tuple)
|
template <class StringType = std::string, class... Args> inline StringType tupleToString(const std::tuple<Args...> &tuple)
|
||||||
{
|
{
|
||||||
StringType res;
|
StringType res;
|
||||||
res.reserve(Helper::TupleToString<StringType, decltype(tuple), sizeof...(Args)>::precomputeSize(tuple));
|
res.reserve(Helper::TupleToString<StringType, decltype(tuple), sizeof...(Args)>::precomputeSize(tuple));
|
||||||
|
@ -144,7 +144,7 @@ template <class StringType = std::string, class... Args> StringType tupleToStrin
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class StringType = std::string, class... Args> constexpr StringType argsToString(Args &&... args)
|
template <class StringType = std::string, class... Args> inline StringType argsToString(Args &&... args)
|
||||||
{
|
{
|
||||||
return tupleToString(std::make_tuple(args...));
|
return tupleToString(std::make_tuple(args...));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue