/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Copyright 2019, Danny Robson */ #pragma once #include /////////////////////////////////////////////////////////////////////////////// namespace cruft { /// A simple string-like class that allows constexpr representation of /// strings. /// /// This allows strings to be represented as instances of fixed_string in /// template parameters (rather than using vendor specific array /// extensions). template struct fixed_string { using value_type = char; char value[N + 1] {}; static std::size_t size (void) { return N; } constexpr fixed_string (char const _value[N+1]) noexcept { for (std::size_t i = 0; i <= N; ++i) value[i] = _value[i]; } constexpr operator char const* () const { return value; } constexpr operator std::string_view () const { return value; } constexpr char const* c_str (void) const noexcept { return value; } auto begin (void) const& noexcept { return std::begin (value); } auto end (void) const& noexcept { return std::end (value); } constexpr bool operator== (fixed_string const&) const noexcept = default; template requires (M != N) constexpr bool operator== (fixed_string const&) const noexcept { return false; } }; template fixed_string (char const (&)[N]) -> fixed_string; }