Move constructor and noexcept correctness
This commit is contained in:
@@ -337,7 +337,7 @@ namespace chaiscript
|
|||||||
Boxed_Number(Boxed_Value v)
|
Boxed_Number(Boxed_Value v)
|
||||||
: bv(std::move(v))
|
: bv(std::move(v))
|
||||||
{
|
{
|
||||||
validate_boxed_number(v);
|
validate_boxed_number(bv);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T> explicit Boxed_Number(T t)
|
template<typename T> explicit Boxed_Number(T t)
|
||||||
|
@@ -61,9 +61,6 @@ namespace chaiscript
|
|||||||
|
|
||||||
Data(const Data &) = delete;
|
Data(const Data &) = delete;
|
||||||
|
|
||||||
~Data()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
Type_Info m_type_info;
|
Type_Info m_type_info;
|
||||||
chaiscript::detail::Any m_obj;
|
chaiscript::detail::Any m_obj;
|
||||||
@@ -151,21 +148,18 @@ namespace chaiscript
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Copy constructor - each copy shares the same data pointer
|
|
||||||
Boxed_Value(const Boxed_Value &t_so)
|
|
||||||
: m_data(t_so.m_data)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Unknown-type constructor
|
/// Unknown-type constructor
|
||||||
Boxed_Value()
|
Boxed_Value()
|
||||||
: m_data(Object_Data::get())
|
: m_data(Object_Data::get())
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
~Boxed_Value()
|
|
||||||
{
|
Boxed_Value(Boxed_Value&&) = default;
|
||||||
}
|
Boxed_Value& operator=(Boxed_Value&&) = default;
|
||||||
|
|
||||||
|
Boxed_Value(const Boxed_Value&) = default;
|
||||||
|
Boxed_Value& operator=(const Boxed_Value&) = default;
|
||||||
|
|
||||||
void swap(Boxed_Value &rhs)
|
void swap(Boxed_Value &rhs)
|
||||||
{
|
{
|
||||||
@@ -180,61 +174,53 @@ namespace chaiscript
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// shared data assignment, same as copy construction
|
const Type_Info &get_type_info() const CHAISCRIPT_NOEXCEPT
|
||||||
Boxed_Value &operator=(const Boxed_Value &rhs)
|
|
||||||
{
|
|
||||||
Boxed_Value temp(rhs);
|
|
||||||
swap(temp);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
const Type_Info &get_type_info() const
|
|
||||||
{
|
{
|
||||||
return m_data->m_type_info;
|
return m_data->m_type_info;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// return true if the object is uninitialized
|
/// return true if the object is uninitialized
|
||||||
bool is_undef() const
|
bool is_undef() const CHAISCRIPT_NOEXCEPT
|
||||||
{
|
{
|
||||||
return m_data->m_type_info.is_undef();
|
return m_data->m_type_info.is_undef();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_const() const
|
bool is_const() const CHAISCRIPT_NOEXCEPT
|
||||||
{
|
{
|
||||||
return m_data->m_type_info.is_const();
|
return m_data->m_type_info.is_const();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_type(const Type_Info &ti) const
|
bool is_type(const Type_Info &ti) const CHAISCRIPT_NOEXCEPT
|
||||||
{
|
{
|
||||||
return m_data->m_type_info.bare_equal(ti);
|
return m_data->m_type_info.bare_equal(ti);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_null() const
|
bool is_null() const CHAISCRIPT_NOEXCEPT
|
||||||
{
|
{
|
||||||
return (m_data->m_data_ptr == nullptr && m_data->m_const_data_ptr == nullptr);
|
return (m_data->m_data_ptr == nullptr && m_data->m_const_data_ptr == nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
const chaiscript::detail::Any & get() const
|
const chaiscript::detail::Any & get() const CHAISCRIPT_NOEXCEPT
|
||||||
{
|
{
|
||||||
return m_data->m_obj;
|
return m_data->m_obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_ref() const
|
bool is_ref() const CHAISCRIPT_NOEXCEPT
|
||||||
{
|
{
|
||||||
return m_data->m_is_ref;
|
return m_data->m_is_ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_pointer() const
|
bool is_pointer() const CHAISCRIPT_NOEXCEPT
|
||||||
{
|
{
|
||||||
return !is_ref();
|
return !is_ref();
|
||||||
}
|
}
|
||||||
|
|
||||||
void *get_ptr() const
|
void *get_ptr() const CHAISCRIPT_NOEXCEPT
|
||||||
{
|
{
|
||||||
return m_data->m_data_ptr;
|
return m_data->m_data_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
const void *get_const_ptr() const
|
const void *get_const_ptr() const CHAISCRIPT_NOEXCEPT
|
||||||
{
|
{
|
||||||
return m_data->m_const_data_ptr;
|
return m_data->m_const_data_ptr;
|
||||||
}
|
}
|
||||||
@@ -260,7 +246,7 @@ namespace chaiscript
|
|||||||
|
|
||||||
|
|
||||||
/// \returns true if the two Boxed_Values share the same internal type
|
/// \returns true if the two Boxed_Values share the same internal type
|
||||||
static bool type_match(Boxed_Value l, Boxed_Value r)
|
static bool type_match(const Boxed_Value &l, const Boxed_Value &r) CHAISCRIPT_NOEXCEPT
|
||||||
{
|
{
|
||||||
return l.get_type_info() == r.get_type_info();
|
return l.get_type_info() == r.get_type_info();
|
||||||
}
|
}
|
||||||
|
@@ -39,7 +39,7 @@ namespace chaiscript
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Type_Info()
|
CHAISCRIPT_CONSTEXPR Type_Info()
|
||||||
: m_type_info(nullptr), m_bare_type_info(nullptr),
|
: m_type_info(nullptr), m_bare_type_info(nullptr),
|
||||||
m_is_const(false), m_is_reference(false), m_is_pointer(false),
|
m_is_const(false), m_is_reference(false), m_is_pointer(false),
|
||||||
m_is_void(false), m_is_arithmetic(false),
|
m_is_void(false), m_is_arithmetic(false),
|
||||||
@@ -47,63 +47,47 @@ namespace chaiscript
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Type_Info(const Type_Info &ti)
|
Type_Info(Type_Info&&) = default;
|
||||||
: m_type_info(ti.m_type_info),
|
Type_Info& operator=(Type_Info&&) = default;
|
||||||
m_bare_type_info(ti.m_bare_type_info),
|
|
||||||
m_is_const(ti.m_is_const), m_is_reference(ti.m_is_reference),
|
|
||||||
m_is_pointer(ti.m_is_pointer),
|
|
||||||
m_is_void(ti.m_is_void), m_is_arithmetic(ti.m_is_arithmetic),
|
|
||||||
m_is_undef(ti.m_is_undef)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
Type_Info &operator=(const Type_Info &ti)
|
Type_Info(const Type_Info&) = default;
|
||||||
{
|
Type_Info& operator=(const Type_Info&) = default;
|
||||||
m_type_info = ti.m_type_info;
|
|
||||||
m_bare_type_info = ti.m_bare_type_info;
|
|
||||||
m_is_const = ti.m_is_const;
|
|
||||||
m_is_reference = ti.m_is_reference;
|
|
||||||
m_is_pointer = ti.m_is_pointer;
|
|
||||||
m_is_void = ti.m_is_void;
|
|
||||||
m_is_arithmetic = ti.m_is_arithmetic;
|
|
||||||
m_is_undef = ti.m_is_undef;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator<(const Type_Info &ti) const
|
|
||||||
|
CHAISCRIPT_CONSTEXPR bool operator<(const Type_Info &ti) const CHAISCRIPT_NOEXCEPT
|
||||||
{
|
{
|
||||||
return m_type_info < ti.m_type_info;
|
return m_type_info < ti.m_type_info;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator==(const Type_Info &ti) const
|
CHAISCRIPT_CONSTEXPR bool operator==(const Type_Info &ti) const CHAISCRIPT_NOEXCEPT
|
||||||
{
|
{
|
||||||
return ti.m_type_info == m_type_info
|
return ti.m_type_info == m_type_info
|
||||||
|| (ti.m_type_info && m_type_info && *ti.m_type_info == *m_type_info);
|
|| (ti.m_type_info && m_type_info && *ti.m_type_info == *m_type_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator==(const std::type_info &ti) const
|
CHAISCRIPT_CONSTEXPR bool operator==(const std::type_info &ti) const CHAISCRIPT_NOEXCEPT
|
||||||
{
|
{
|
||||||
return m_type_info != nullptr && (*m_type_info) == ti;
|
return m_type_info != nullptr && (*m_type_info) == ti;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool bare_equal(const Type_Info &ti) const
|
CHAISCRIPT_CONSTEXPR bool bare_equal(const Type_Info &ti) const CHAISCRIPT_NOEXCEPT
|
||||||
{
|
{
|
||||||
return ti.m_bare_type_info == m_bare_type_info
|
return ti.m_bare_type_info == m_bare_type_info
|
||||||
|| (ti.m_bare_type_info && m_bare_type_info && *ti.m_bare_type_info == *m_bare_type_info);
|
|| (ti.m_bare_type_info && m_bare_type_info && *ti.m_bare_type_info == *m_bare_type_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool bare_equal_type_info(const std::type_info &ti) const
|
CHAISCRIPT_CONSTEXPR bool bare_equal_type_info(const std::type_info &ti) const CHAISCRIPT_NOEXCEPT
|
||||||
{
|
{
|
||||||
return m_bare_type_info != nullptr
|
return m_bare_type_info != nullptr
|
||||||
&& (*m_bare_type_info) == ti;
|
&& (*m_bare_type_info) == ti;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_const() const { return m_is_const; }
|
CHAISCRIPT_CONSTEXPR bool is_const() const CHAISCRIPT_NOEXCEPT { return m_is_const; }
|
||||||
bool is_reference() const { return m_is_reference; }
|
CHAISCRIPT_CONSTEXPR bool is_reference() const CHAISCRIPT_NOEXCEPT { return m_is_reference; }
|
||||||
bool is_void() const { return m_is_void; }
|
CHAISCRIPT_CONSTEXPR bool is_void() const CHAISCRIPT_NOEXCEPT { return m_is_void; }
|
||||||
bool is_arithmetic() const { return m_is_arithmetic; }
|
CHAISCRIPT_CONSTEXPR bool is_arithmetic() const CHAISCRIPT_NOEXCEPT { return m_is_arithmetic; }
|
||||||
bool is_undef() const { return m_is_undef || m_bare_type_info == nullptr; }
|
CHAISCRIPT_CONSTEXPR bool is_undef() const CHAISCRIPT_NOEXCEPT { return m_is_undef || m_bare_type_info == nullptr; }
|
||||||
bool is_pointer() const { return m_is_pointer; }
|
CHAISCRIPT_CONSTEXPR bool is_pointer() const CHAISCRIPT_NOEXCEPT { return m_is_pointer; }
|
||||||
|
|
||||||
std::string name() const
|
std::string name() const
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user