8#ifndef ADOBE_SERIALIZABLE_HPP
9#define ADOBE_SERIALIZABLE_HPP
25#if __cplusplus < 202002L
29namespace implementation {
34struct sfinae_true : std::true_type {};
38template <
class T,
class Stream>
39static auto test_stream_insertion(
int)
40 -> sfinae_true<decltype(std::declval<Stream>() << std::declval<T>())>;
42template <
class,
class>
43static auto test_stream_insertion(
long) -> std::false_type;
51template <
class T,
class Stream>
60inline typename std::enable_if<has_ostream_insertion<T>::value>
::type
66inline typename std::enable_if<!has_ostream_insertion<T>::value>::type
73 if constexpr (
requires { s << x; }) {
81 s << std::boolalpha << x << std::noboolalpha;
100 void operator()(std::ostream& s,
const std::reference_wrapper<T>& x)
const {
109 template <
typename T>
120 template <
typename T>
124 if (
type !=
typeid(T))
127 return static_cast<const instance<T>&
>(
object()).object_m;
130 template <
typename T>
132 return const_cast<T&
>(
const_cast<const serializable_t&
>(*this).cast<T>());
137 virtual ~instance_t() {}
139 virtual std::unique_ptr<instance_t> _copy()
const = 0;
141 virtual void _out(std::ostream& s)
const = 0;
142 virtual const std::type_info&
type_info()
const = 0;
145 template <
typename T>
146 struct instance final : instance_t {
147 explicit instance(T x) : object_m(std::move(x)) {}
149 std::unique_ptr<instance_t> _copy()
const override {
150 return std::make_unique<instance>(object_m);
155 const std::type_info&
type_info()
const override {
return typeid(T); }
160 instance_t&
object() {
return *instance_m; }
161 const instance_t&
object()
const {
return *instance_m; }
163 std::unique_ptr<instance_t> instance_m;
An exception class thrown during ASL failures to cast.
const std::type_info & type_info() const
serializable_t(serializable_t &&x)
void operator()(std::ostream &s) const
serializable_t(const serializable_t &x)
O to_string(double x, O out, bool precise=false)
Convert double precision floating point numbers to ascii representation.
void ostream_insertion< bool >(std::ostream &s, const bool &x)
void ostream_insertion< double >(std::ostream &s, const double &x)
std::enable_if< has_ostream_insertion< T >::value >::type ostream_insertion(std::ostream &s, const T &x)
has_stream_insertion< T, std::ostream & > has_ostream_insertion
std::ostream & operator<<(std::ostream &s, const extents_t &x)
void operator()(std::ostream &s, const std::reference_wrapper< T > &x) const
void operator()(std::ostream &s, const T &x) const