improve cstring ctr
This commit is contained in:
parent
f7554a166f
commit
d33424c377
1 changed files with 15 additions and 9 deletions
|
@ -43,6 +43,12 @@
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
# pragma warning(push)
|
||||||
|
# pragma warning(disable : 26495) // Variable 'nameof::cstring<N>::chars_' is uninitialized.
|
||||||
|
# pragma warning(disable : 26451) // Arithmetic overflow: 'strings_[static_cast<U>(value) - min_v<E>]' and 'indexes_[static_cast<U>(value) - min_v<E>]' using operator '-' on a 4 byte value and then casting the result to a 8 byte value.
|
||||||
|
#endif
|
||||||
|
|
||||||
// Checks nameof_type compiler compatibility.
|
// Checks nameof_type compiler compatibility.
|
||||||
#if defined(__clang__) || defined(__GNUC__) || defined(_MSC_VER)
|
#if defined(__clang__) || defined(__GNUC__) || defined(_MSC_VER)
|
||||||
# undef NAMEOF_TYPE_SUPPORTED
|
# undef NAMEOF_TYPE_SUPPORTED
|
||||||
|
@ -94,14 +100,8 @@ class [[nodiscard]] cstring {
|
||||||
|
|
||||||
std::array<char, N + 1> chars_;
|
std::array<char, N + 1> chars_;
|
||||||
|
|
||||||
constexpr auto to_chars(std::string_view str) noexcept {
|
template <std::size_t... I>
|
||||||
assert(str.size() == N);
|
constexpr cstring(std::string_view str, std::index_sequence<I...>) noexcept : chars_{{str[I]..., '\0'}} {}
|
||||||
decltype(chars_) chars = {};
|
|
||||||
for (std::size_t i = 0; i < str.size() && i < N; ++i) {
|
|
||||||
chars[i] = str[i];
|
|
||||||
}
|
|
||||||
return chars;
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
using value_type = char;
|
using value_type = char;
|
||||||
|
@ -118,7 +118,9 @@ class [[nodiscard]] cstring {
|
||||||
using reverse_iterator = std::reverse_iterator<iterator>;
|
using reverse_iterator = std::reverse_iterator<iterator>;
|
||||||
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
|
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
|
||||||
|
|
||||||
constexpr explicit cstring(std::string_view str) noexcept : chars_{to_chars(str)} {}
|
constexpr explicit cstring(std::string_view str) noexcept : cstring{str, std::make_index_sequence<N>{}} {
|
||||||
|
assert(str.size() == N);
|
||||||
|
}
|
||||||
|
|
||||||
constexpr cstring() = delete;
|
constexpr cstring() = delete;
|
||||||
|
|
||||||
|
@ -662,4 +664,8 @@ template <typename T>
|
||||||
// Obtains string name full type of expression, with reference and cv-qualifiers.
|
// Obtains string name full type of expression, with reference and cv-qualifiers.
|
||||||
#define NAMEOF_FULL_TYPE_EXPR(...) ::nameof::nameof_full_type<decltype(__VA_ARGS__)>()
|
#define NAMEOF_FULL_TYPE_EXPR(...) ::nameof::nameof_full_type<decltype(__VA_ARGS__)>()
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
# pragma warning(pop)
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // NEARGYE_NAMEOF_HPP
|
#endif // NEARGYE_NAMEOF_HPP
|
||||||
|
|
Loading…
Reference in a new issue