]> git.tdb.fi Git - libs/core.git/blobdiff - source/core/variant.h
Add decorations for things which are considered part of the API
[libs/core.git] / source / core / variant.h
index 60501f3308e0c36e54ab4c5bafac4379f279db58..c0b0aebc3e901171fd9b60af95c8fe5826fd33d3 100644 (file)
@@ -5,17 +5,18 @@
 #include <type_traits>
 #include <typeinfo>
 #include "meta.h"
+#include "mspcore_api.h"
 
 namespace Msp {
 
-class type_mismatch: public std::runtime_error
+class MSPCORE_API type_mismatch: public std::runtime_error
 {
 public:
        type_mismatch(const std::type_info &, const std::type_info &);
 };
 
 
-class Variant
+class MSPCORE_API Variant
 {
 public:
        static constexpr unsigned INTERNAL_SIZE = 2*sizeof(void *);
@@ -61,9 +62,9 @@ public:
        const T &value() const { return const_cast<Variant *>(this)->get<T>(); }
 
        template<typename T>
-       bool has_type() const { return funcs==get_functions<typename std::remove_cv<T>::type>(); }
+       bool has_type() const { return type_equals(funcs, get_functions<typename std::remove_cv<T>::type>()); }
 
-       bool has_same_type(const Variant &v) const { return (funcs && funcs==v.funcs); }
+       bool has_same_type(const Variant &v) const { return type_equals(funcs, v.funcs); }
 
        template<typename T>
        DEPRECATED bool check_type() const { return has_type<T>(); }
@@ -77,6 +78,8 @@ public:
        operator T() const { return value<T>(); }
 
 private:
+       static bool type_equals(const Functions *, const Functions *);
+
        template<typename T>
        static constexpr bool is_small() { return (sizeof(T)<=INTERNAL_SIZE && alignof(T)<=alignof(void *)); }
 
@@ -162,6 +165,16 @@ inline T &Variant::get()
                return **reinterpret_cast<T **>(storage);
 }
 
+inline bool Variant::type_equals(const Functions *funcs1, const Functions *funcs2)
+{
+       if(!funcs1 || !funcs2)
+               return false;
+       else if(funcs1==funcs2)
+               return true;
+       else
+               return funcs1->get_type()==funcs2->get_type();
+}
+
 template<typename T>
 inline const Variant::Functions *Variant::get_functions()
 {