]> git.tdb.fi Git - libs/core.git/commitdiff
Fallback to comparing typeid in Variant if funcs are not the same
authorMikko Rasa <tdb@tdb.fi>
Mon, 2 Jan 2023 21:38:27 +0000 (23:38 +0200)
committerMikko Rasa <tdb@tdb.fi>
Mon, 2 Jan 2023 22:21:25 +0000 (00:21 +0200)
On Windows it looks like instantiations of a function template in
different modules may have different addresses of its static locals.

source/core/variant.h

index 60501f3308e0c36e54ab4c5bafac4379f279db58..5de5a726f2dde80ee987c582851bbac2ca0523e6 100644 (file)
@@ -61,9 +61,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 +77,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 +164,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()
 {