11#ifndef CHAISCRIPT_BOXED_VALUE_HPP_
12#define CHAISCRIPT_BOXED_VALUE_HPP_
43 const void *t_void_ptr,
45 : m_type_info(ti), m_obj(
std::move(to)), m_data_ptr(ti.
is_const()?nullptr:const_cast<void *>(t_void_ptr)), m_const_data_ptr(t_void_ptr),
46 m_is_ref(
is_ref), m_return_value(t_return_value)
52 m_type_info = rhs.m_type_info;
54 m_is_ref = rhs.m_is_ref;
55 m_data_ptr = rhs.m_data_ptr;
56 m_const_data_ptr = rhs.m_const_data_ptr;
57 m_return_value = rhs.m_return_value;
61 m_attrs = std::make_unique<std::map<std::string, std::shared_ptr<Data>>>(*rhs.m_attrs);
67 Data(
const Data &) =
delete;
69 Data(Data &&) =
default;
70 Data &operator=(Data &&rhs) =
default;
73 Type_Info m_type_info;
74 chaiscript::detail::Any m_obj;
76 const void *m_const_data_ptr;
77 std::unique_ptr<std::map<std::string, std::shared_ptr<Data>>> m_attrs;
84 static auto get(Boxed_Value::Void_Type,
bool t_return_value)
86 return std::make_shared<Data>(
88 chaiscript::detail::Any(),
96 static auto get(
const std::shared_ptr<T> *obj,
bool t_return_value)
98 return get(*obj, t_return_value);
102 static auto get(
const std::shared_ptr<T> &obj,
bool t_return_value)
104 return std::make_shared<Data>(
106 chaiscript::detail::Any(obj),
114 static auto get(std::shared_ptr<T> &&obj,
bool t_return_value)
116 auto ptr = obj.get();
117 return std::make_shared<Data>(
119 chaiscript::detail::Any(std::move(obj)),
129 static auto get(T *t,
bool t_return_value)
131 return get(std::ref(*t), t_return_value);
135 static auto get(
const T *t,
bool t_return_value)
137 return get(std::cref(*t), t_return_value);
142 static auto get(std::reference_wrapper<T> obj,
bool t_return_value)
145 return std::make_shared<Data>(
147 chaiscript::detail::Any(std::move(obj)),
155 static auto get(std::unique_ptr<T> &&obj,
bool t_return_value)
157 auto ptr = obj.get();
158 return std::make_shared<Data>(
160 chaiscript::detail::Any(std::make_shared<std::unique_ptr<T>>(std::move(obj))),
168 static auto get(T t,
bool t_return_value)
170 auto p = std::make_shared<T>(std::move(t));
172 return std::make_shared<Data>(
174 chaiscript::detail::Any(std::move(p)),
181 static std::shared_ptr<Data>
get()
183 return std::make_shared<Data>(
185 chaiscript::detail::Any(),
197 typename =
typename std::enable_if<!std::is_same<Boxed_Value, typename std::decay<T>::type>::value>::type>
199 : m_data(Object_Data::
get(
std::forward<
T>(t), t_return_value))
213 std::swap(m_data, rhs.m_data);
220 (*m_data) = (*rhs.m_data);
226 return m_data->m_type_info;
232 return m_data->m_type_info.is_undef();
237 return m_data->m_type_info.is_const();
242 return m_data->m_type_info.bare_equal(ti);
250 Sentinel(std::shared_ptr<T> &t_ptr, Data &
data)
251 : m_ptr(t_ptr), m_data(
data)
258 const auto ptr_ = m_ptr.get().get();
259 m_data.get().m_data_ptr = ptr_;
260 m_data.get().m_const_data_ptr = ptr_;
263 Sentinel&
operator=(Sentinel&&s) =
default;
264 Sentinel(Sentinel &&s) =
default;
266 operator std::shared_ptr<T>&()
const
271 Sentinel &
operator=(
const Sentinel &) =
delete;
272 Sentinel(Sentinel&) =
delete;
274 std::reference_wrapper<std::shared_ptr<T>> m_ptr;
275 std::reference_wrapper<Data> m_data;
278 return Sentinel(ptr, *(m_data.get()));
283 return (m_data->m_data_ptr ==
nullptr && m_data->m_const_data_ptr ==
nullptr);
288 return m_data->m_obj;
293 return m_data->m_is_ref;
298 return m_data->m_return_value;
303 m_data->m_return_value =
false;
313 return m_data->m_data_ptr;
318 return m_data->m_const_data_ptr;
323 if (!m_data->m_attrs)
325 m_data->m_attrs = std::make_unique<std::map<std::string, std::shared_ptr<Data>>>();
328 auto &attr = (*m_data->m_attrs)[t_name];
340 if (t_obj.m_data->m_attrs)
342 m_data->m_attrs = std::make_unique<std::map<std::string, std::shared_ptr<Data>>>(*t_obj.m_data->m_attrs);
358 return l.get_type_info() == r.get_type_info();
363 struct Internal_Construction{};
365 Boxed_Value(std::shared_ptr<Data> t_data, Internal_Construction)
366 : m_data(
std::move(t_data)) {
369 std::shared_ptr<Data> m_data = Object_Data::get();
400 return Boxed_Value(std::make_shared<
typename std::add_const<T>::type >(t));
411 return Boxed_Value(
const_cast<typename std::add_const<T>::type *
>(t) );
422 return Boxed_Value( std::const_pointer_cast<
typename std::add_const<T>::type>(t) );
A wrapper for holding any valid C++ type. All types in ChaiScript are Boxed_Value objects.
Definition boxed_value.hpp:28
Boxed_Value & operator=(const Boxed_Value &)=default
bool is_ref() const noexcept
Definition boxed_value.hpp:291
Boxed_Value(Boxed_Value &&)=default
bool is_pointer() const noexcept
Definition boxed_value.hpp:306
void * get_ptr() const noexcept
Definition boxed_value.hpp:311
Boxed_Value & operator=(Boxed_Value &&)=default
const void * get_const_ptr() const noexcept
Definition boxed_value.hpp:316
Boxed_Value(const Boxed_Value &)=default
Boxed_Value(T &&t, bool t_return_value=false)
Basic Boxed_Value constructor.
Definition boxed_value.hpp:198
Boxed_Value & clone_attrs(const Boxed_Value &t_obj)
Definition boxed_value.hpp:347
bool is_const() const noexcept
Definition boxed_value.hpp:235
Boxed_Value assign(const Boxed_Value &rhs)
Definition boxed_value.hpp:218
const chaiscript::detail::Any & get() const noexcept
Definition boxed_value.hpp:286
bool is_type(const Type_Info &ti) const noexcept
Definition boxed_value.hpp:240
bool is_null() const noexcept
Definition boxed_value.hpp:281
bool is_undef() const noexcept
return true if the object is uninitialized
Definition boxed_value.hpp:230
const Type_Info & get_type_info() const noexcept
Definition boxed_value.hpp:224
void swap(Boxed_Value &rhs)
Definition boxed_value.hpp:211
void reset_return_value() const noexcept
Definition boxed_value.hpp:301
static bool type_match(const Boxed_Value &l, const Boxed_Value &r) noexcept
Definition boxed_value.hpp:356
Boxed_Value & copy_attrs(const Boxed_Value &t_obj)
Definition boxed_value.hpp:338
bool is_return_value() const noexcept
Definition boxed_value.hpp:296
Boxed_Value()=default
Unknown-type constructor.
auto pointer_sentinel(std::shared_ptr< T > &ptr) const
Definition boxed_value.hpp:247
Boxed_Value get_attr(const std::string &t_name)
Definition boxed_value.hpp:321
Compile time deduced information about a type.
Definition type_info.hpp:34
lazy data
Definition meshpage.php:1583
Boxed_Value const_var_impl(const T &t)
Takes a value, copies it and returns a Boxed_Value object that is immutable.
Definition boxed_value.hpp:398
Namespace chaiscript contains every API call that the average user will be concerned with.
Boxed_Value void_var()
Definition boxed_value.hpp:466
Boxed_Value var(T &&t)
Creates a Boxed_Value. If the object passed in is a value type, it is copied. If it is a pointer,...
Definition boxed_value.hpp:387
Boxed_Value const_var(const T &t)
Takes an object and returns an immutable Boxed_Value. If the object is a std::reference or pointer ty...
Definition boxed_value.hpp:461
double f(const std::string &, double, bool) noexcept
Definition profile_cpp_calls_2.cpp:4
used for explicitly creating a "void" object
Definition boxed_value.hpp:32
static constexpr Type_Info get()
Definition type_info.hpp:138