diff --git a/include/ylt/struct_pack/md5_constexpr.hpp b/include/ylt/struct_pack/md5_constexpr.hpp index 4664a92a5a..027a94bc7f 100644 --- a/include/ylt/struct_pack/md5_constexpr.hpp +++ b/include/ylt/struct_pack/md5_constexpr.hpp @@ -25,21 +25,12 @@ namespace struct_pack { template -struct string_literal : public std::array { - using base = std::array; - using value_type = typename base::value_type; - using pointer = typename base::pointer; - using const_pointer = typename base::const_pointer; - using iterator = typename base::iterator; - using const_iterator = typename base::const_iterator; - using reference = typename base::const_pointer; - using const_reference = typename base::const_pointer; - +struct string_literal { constexpr string_literal() = default; - constexpr string_literal(const CharType (&value)[Size + 1]) { - // don't use std::copy_n here to support low version stdlibc++ - for (size_t i = 0; i < Size + 1; ++i) { - (*this)[i] = value[i]; + + constexpr string_literal(const CharType (&value)[Size + 1]) : ar{} { + for (size_t i = 0; i <= Size; ++i) { + ar[i] = value[i]; } } @@ -47,21 +38,14 @@ struct string_literal : public std::array { constexpr bool empty() const { return !Size; } - using base::begin; - - constexpr auto end() { return base::end() - 1; } + constexpr char &operator[](std::size_t sz) { return ar[sz]; } - constexpr auto end() const { return base::end() - 1; } + constexpr const char &operator[](std::size_t sz) const { return ar[sz]; } - using base::data; - using base::operator[]; - using base::at; + constexpr const char *data() const { return &ar[0]; } private: - using base::cbegin; - using base::cend; - using base::rbegin; - using base::rend; + CharType ar[Size + 1]; }; template @@ -93,7 +77,6 @@ template decltype(auto) constexpr operator+(string_literal str1, string_literal str2) { string_literal ret{}; - // don't use std::copy_n here to support low version stdlibc++ for (size_t i = 0; i < Len1; ++i) { ret[i] = str1[i]; }