/* * 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 { std::copy_n (_value, N, value); } 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); } }; template fixed_string (char const (&)[N]) -> fixed_string; }