// Matrix Construct // // Copyright (C) Matrix Construct Developers, Authors & Contributors // Copyright (C) 2016-2018 Jason Volk // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice is present in all copies. The // full license for this software is available in the LICENSE file. #pragma once #define HAVE_IRCD_BYTE_VIEW_H namespace ircd { template struct byte_view; template<> struct byte_view; } /// bytes -> string_view. A byte_view is raw data of byte_view. /// /// This is an important specialization to take note of. When you see /// byte_view know that another type's bytes are being represented /// by the string_view if that type is not string_view family itself. template<> struct ircd::byte_view :string_view { template::value, int *>::type = nullptr> byte_view(const T &t) :string_view{reinterpret_cast(&t), sizeof(T)} {} /// string_view -> string_view (completeness) byte_view(const string_view &t = {}) :string_view{t} {} }; /// string_view -> bytes template struct ircd::byte_view { string_view s; operator const T &() const; byte_view(const string_view &s = {}) :s{s} {} // bytes -> bytes (completeness) byte_view(const T &t) :s{byte_view{t}} {} }; template inline ircd::byte_view::operator const T &() const { assert(sizeof(T) <= size(s)); if constexpr(safety) if(unlikely(sizeof(T) > s.size())) throw std::bad_cast(); return *reinterpret_cast(s.data()); }