]> git.tdb.fi Git - libs/datafile.git/commitdiff
Simplify DynamicObjectLoader with an if constexpr
authorMikko Rasa <tdb@tdb.fi>
Mon, 11 Dec 2023 08:28:45 +0000 (10:28 +0200)
committerMikko Rasa <tdb@tdb.fi>
Mon, 11 Dec 2023 08:28:45 +0000 (10:28 +0200)
Build
source/dynamicobjectloader.h

diff --git a/Build b/Build
index 5e962e65896b7dded06365323b4fa6ba68878350..0339dd2710a90493e4fae46e0790fd35c435f380 100644 (file)
--- a/Build
+++ b/Build
@@ -8,7 +8,7 @@ package "mspdatafile"
 
        build_info
        {
-               standard CXX "c++14";
+               standard CXX "c++17";
        };
 
        library "mspdatafile"
index 43c4b1fedf82e9f7a06d0c716879a91de30b4fca..2cf1b361df3de60fa27f58e22d8283a96a51c609 100644 (file)
@@ -52,14 +52,6 @@ public:
 protected:
        virtual void type(const Symbol &);
 
-private:
-       template<typename U>
-       typename std::enable_if<NeedsCollection<typename U::Loader>::value, std::unique_ptr<typename U::Loader>>::type create_object_loader(U &obj) const;
-
-       template<typename U>
-       typename std::enable_if<!NeedsCollection<typename U::Loader>::value, std::unique_ptr<typename U::Loader>>::type create_object_loader(U &obj) const;
-
-protected:
        virtual const TypeRegistry &get_type_registry() const = 0;
 };
 
@@ -100,29 +92,20 @@ void DynamicObjectLoader<T, C>::type(const Symbol &t)
        get_type_registry().invoke(t.name, *this);
 }
 
-template<typename T, typename C>
-template<typename U>
-typename std::enable_if<NeedsCollection<typename U::Loader>::value, std::unique_ptr<typename U::Loader>>::type DynamicObjectLoader<T, C>::create_object_loader(U &obj) const
-{
-       if(!coll)
-               throw no_collection(typeid(U));
-       return std::make_unique<typename U::Loader>(obj, *coll);
-}
-
-template<typename T, typename C>
-template<typename U>
-typename std::enable_if<!NeedsCollection<typename U::Loader>::value, std::unique_ptr<typename U::Loader>>::type DynamicObjectLoader<T, C>::create_object_loader(U &obj) const
-{
-       return std::make_unique<typename U::Loader>(obj);
-}
-
 
 template<typename T, typename C>
 template<typename U>
 void DynamicObjectLoader<T, C>::CreateObject<U>::operator()(const std::string &, DynamicObjectLoader &ldr) const
 {
        ldr.object = std::make_unique<U>();
-       ldr.obj_loader = ldr.create_object_loader<U>(static_cast<U &>(*ldr.object));
+       if constexpr(NeedsCollection<typename U::Loader>::value)
+       {
+               if(!ldr.coll)
+                       throw no_collection(typeid(U));
+               ldr.obj_loader = std::make_unique<typename U::Loader>(static_cast<U &>(*ldr.object), *ldr.coll);
+       }
+       else
+               ldr.obj_loader = std::make_unique<typename U::Loader>(static_cast<U &>(*ldr.object));
        ldr.add_auxiliary_loader(*ldr.obj_loader);
        ldr.store_func = [](Collection &c, const std::string &n, std::unique_ptr<T> o){ c.add(n, std::unique_ptr<U>(static_cast<U *>(o.release()))); };
 }