aboutsummaryrefslogtreecommitdiffstats
path: root/util/generic
diff options
context:
space:
mode:
authorswarmer <swarmer@yandex-team.ru>2022-05-24 01:42:42 +0300
committerswarmer <swarmer@yandex-team.ru>2022-05-24 01:42:42 +0300
commit9e6590dab63a1a07e738a246030af9b888333214 (patch)
tree038ab3bdf14231ab80bcfa12922f2371ea0c0a31 /util/generic
parentcc9b48149be0bca6e6c350983ace4fc660902b80 (diff)
downloadydb-9e6590dab63a1a07e738a246030af9b888333214.tar.gz
[util] StripInPlace should modify string in-place
ref:2aec19528c2378a0994534ec032550413a095389
Diffstat (limited to 'util/generic')
-rw-r--r--util/generic/typetraits.h15
-rw-r--r--util/generic/typetraits_ut.cpp10
2 files changed, 25 insertions, 0 deletions
diff --git a/util/generic/typetraits.h b/util/generic/typetraits.h
index d165bd1a068..6542d736215 100644
--- a/util/generic/typetraits.h
+++ b/util/generic/typetraits.h
@@ -263,12 +263,27 @@ template <class R, class T, class... Args>
struct TIsPointerToConstMemberFunction<R (T::*)(Args..., ...) const&&>: std::true_type {
};
+namespace NPrivate {
+ template <template <typename...> class TBase, class TDerived>
+ struct TIsBaseOfTemplateHelper {
+ template <typename... Ts>
+ static constexpr std::true_type Check(const TBase<Ts...>*);
+
+ static constexpr std::false_type Check(...);
+
+ using TType = decltype(Check(std::declval<TDerived*>()));
+ };
+}
+
template <template <class...> class T, class U>
struct TIsSpecializationOf: std::false_type {};
template <template <class...> class T, class... Ts>
struct TIsSpecializationOf<T, T<Ts...>>: std::true_type {};
+template <template <typename...> class TBase, class TDerived>
+using TIsTemplateBaseOf = typename ::NPrivate::TIsBaseOfTemplateHelper<TBase, TDerived>::TType;
+
/*
* TDependentFalse is a constant dependent on a template parameter.
* Use it in static_assert in a false branch of if constexpr to produce a compile error.
diff --git a/util/generic/typetraits_ut.cpp b/util/generic/typetraits_ut.cpp
index e7571c75ece..6d17e06b4a4 100644
--- a/util/generic/typetraits_ut.cpp
+++ b/util/generic/typetraits_ut.cpp
@@ -457,6 +457,16 @@ static_assert(TIsSpecializationOf<std::tuple, std::tuple<int, double, char>>::va
static_assert(!TIsSpecializationOf<std::vector, std::tuple<int, double, char>>::value, "");
static_assert(!TIsSpecializationOf<std::pair, std::vector<int>>::value, "");
+// test for TIsTemplateBaseOf
+static_assert(TIsTemplateBaseOf<std::vector, std::vector<int>>::value);
+static_assert(TIsTemplateBaseOf<std::tuple, std::tuple<int, double, char>>::value);
+static_assert(TIsTemplateBaseOf<std::basic_string_view, std::wstring_view>::value);
+static_assert(TIsTemplateBaseOf<std::vector, TVector<int>>::value);
+static_assert(!TIsTemplateBaseOf<TVector, std::vector<int>>::value);
+static_assert(TIsTemplateBaseOf<TBasicStringBuf, TWtringBuf>::value);
+static_assert(TIsTemplateBaseOf<std::basic_string_view, TUtf32StringBuf>::value);
+static_assert(TIsTemplateBaseOf<std::basic_string_view, TWtringBuf>::value);
+
// test for TIsIterable
static_assert(TIsIterable<std::vector<int>>::value, "");
static_assert(!TIsIterable<int>::value, "");