From a23a42da1fef53a7fa9854594c55b34db6d54606 Mon Sep 17 00:00:00 2001 From: q66 Date: Mon, 20 Feb 2017 20:43:38 +0100 Subject: [PATCH] remove ostd::to_string and ostd::concat (both replaced by more flexible format) --- ostd/range.hh | 10 ++ ostd/string.hh | 247 ------------------------------------------------- 2 files changed, 10 insertions(+), 247 deletions(-) diff --git a/ostd/range.hh b/ostd/range.hh index 3ea889a..80c9a16 100644 --- a/ostd/range.hh +++ b/ostd/range.hh @@ -869,6 +869,16 @@ inline auto citer(T const &r) -> decltype(ranged_traits::iter(r)) { return ranged_traits::iter(r); } +namespace detail { + template + static std::true_type test_iterable(decltype(ostd::iter(std::declval())) *); + template + static std::false_type test_iterable(...); + + template + constexpr bool iterable_test = decltype(test_iterable(0))::value; +} + template struct half_range: input_range> { using range_category = range_category_t ; diff --git a/ostd/string.hh b/ostd/string.hh index bb1e2d7..df35cea 100644 --- a/ostd/string.hh +++ b/ostd/string.hh @@ -431,253 +431,6 @@ inline namespace string_literals { } } -/* TODO: redesign this */ -template -R &&concat(R &&sink, T const &v, string_range sep, F func) { - auto range = ostd::iter(v); - if (range.empty()) { - return std::forward(sink); - } - for (;;) { - using VT = decltype(func(range.front())); - static_assert( - std::is_convertible_v || - std::is_convertible_v, - "range value must be convertible to string range or char" - ); - if constexpr(std::is_convertible_v) { - range_put_all(sink, string_range{func(range.front())}); - } else { - sink.put(func(range.front())); - } - range.pop_front(); - if (range.empty()) { - break; - } - range_put_all(sink, sep); - } - return std::forward(sink); -} - -template -R &&concat(R &&sink, T const &v, string_range sep = " ") { - auto range = ostd::iter(v); - if (range.empty()) { - return std::forward(sink); - } - for (;;) { - string_range ret = range.front(); - range_put_all(sink, ret); - range.pop_front(); - if (range.empty()) { - break; - } - range_put_all(sink, sep); - } - return std::forward(sink); -} - -template -R &&concat(R &&sink, std::initializer_list v, string_range sep, F func) { - return concat(sink, ostd::iter(v), sep, func); -} - -template -R &&concat(R &&sink, std::initializer_list v, string_range sep = " ") { - return concat(sink, ostd::iter(v), sep); -} - -namespace detail { - template - static std::true_type test_stringify( - decltype(std::declval().to_string(std::declval())) * - ); - - template - static std::false_type test_stringify(...); - - template - constexpr bool stringify_test = decltype(test_stringify(0))::value; - - template - static std::true_type test_iterable(decltype(ostd::iter(std::declval())) *); - template - static std::false_type test_iterable(...); - - template - constexpr bool iterable_test = decltype(test_iterable(0))::value; -} - -template -struct to_string; - -template -struct to_string>> { - std::string operator()(T const &v) const { - std::string ret("{"); - auto x = appender_range{}; - concat(x, ostd::iter(v), ", ", to_string< - std::remove_const_t - >> - >()); - ret += x.get(); - ret += "}"; - return ret; - } -}; - -template -struct to_string> ->> { - std::string operator()(T const &v) const { - auto app = appender(); - if (!v.to_string(app)) { - return std::string{}; - } - return std::move(app.get()); - } -}; - -template<> -struct to_string { - std::string operator()(bool b) { - return b ? "true" : "false"; - } -}; - -template<> -struct to_string { - std::string operator()(char c) { - std::string ret; - ret += c; - return ret; - } -}; - -#define OSTD_TOSTR_NUM(T) \ -template<> \ -struct to_string { \ - std::string operator()(T v) { \ - return std::to_string(v); \ - } \ -}; - -OSTD_TOSTR_NUM(sbyte) -OSTD_TOSTR_NUM(short) -OSTD_TOSTR_NUM(int) -OSTD_TOSTR_NUM(long) -OSTD_TOSTR_NUM(float) -OSTD_TOSTR_NUM(double) - -OSTD_TOSTR_NUM(byte) -OSTD_TOSTR_NUM(ushort) -OSTD_TOSTR_NUM(uint) -OSTD_TOSTR_NUM(ulong) -OSTD_TOSTR_NUM(llong) -OSTD_TOSTR_NUM(ullong) -OSTD_TOSTR_NUM(ldouble) - -#undef OSTD_TOSTR_NUM - -template -struct to_string { - std::string operator()(T *v) { - char buf[16]; - sprintf(buf, "%p", v); - return buf; - } -}; - -template<> -struct to_string { - std::string operator()(char const *s) { - return s; - } -}; - -template<> -struct to_string { - std::string operator()(char *s) { - return s; - } -}; - -template<> -struct to_string { - std::string operator()(std::string const &s) { - return s; - } -}; - -template<> -struct to_string { - std::string operator()(char_range const &s) { - return std::string{s}; - } -}; - -template<> -struct to_string { - std::string operator()(string_range const &s) { - return std::string{s}; - } -}; - -template -struct to_string> { - std::string operator()(std::pair const &v) { - std::string ret{"{"}; - ret += to_string>>()(v.first); - ret += ", "; - ret += to_string>>()(v.second); - ret += "}"; - return ret; - } -}; - -namespace detail { - template - struct tuple_to_str { - template - static void append(std::string &ret, T const &tup) { - ret += ", "; - ret += to_string(tup)) - >>>()(std::get(tup)); - tuple_to_str::append(ret, tup); - } - }; - - template - struct tuple_to_str { - template - static void append(std::string &, T const &) {} - }; - - template - struct tuple_to_str<0, N> { - template - static void append(std::string &ret, T const &tup) { - ret += to_string(tup)) - >>>()(std::get<0>(tup)); - tuple_to_str<1, N>::append(ret, tup); - } - }; -} - -template -struct to_string> { - std::string operator()(std::tuple const &v) { - std::string ret("{"); - detail::tuple_to_str<0, sizeof...(T)>::append(ret, v); - ret += "}"; - return ret; - } -}; - template struct temp_c_string { private: