]> git.tdb.fi Git - libs/gl.git/commitdiff
Hide Scene::named_content in a getter function
authorMikko Rasa <tdb@tdb.fi>
Sat, 3 Aug 2024 11:26:42 +0000 (14:26 +0300)
committerMikko Rasa <tdb@tdb.fi>
Sat, 3 Aug 2024 11:26:42 +0000 (14:26 +0300)
MSVC doesn't allow a thread_local variable with DLL interface

source/render/scene.cpp
source/render/scene.h

index f2f3bbf624f083b5c3a2bbf78b0bedc9a6be8f3f..f9db89dabeaf6caafb8d29dc8537ce8e33f754e9 100644 (file)
@@ -16,8 +16,6 @@ using namespace std;
 namespace Msp {
 namespace GL {
 
-thread_local Scene::ContentMap *Scene::named_content = nullptr;
-
 Scene::GenericLoader::TypeRegistry &Scene::get_scene_registry()
 {
        static Scene::GenericLoader::TypeRegistry registry;
@@ -33,6 +31,12 @@ Scene::GenericLoader::TypeRegistry &Scene::get_scene_registry()
        return registry;
 }
 
+Scene::ContentMap *&Scene::get_named_content_ptr()
+{
+       static thread_local ContentMap *named_content = nullptr;
+       return named_content;
+}
+
 
 Scene::Loader::Loader(Scene &s, Collection &c, ContentMap *m):
        DataFile::CollectionObjectLoader<Scene>(s, &c),
@@ -80,13 +84,13 @@ void Scene::Loader::scene_inline()
 
 void Scene::GenericLoader::prepare()
 {
-       saved_content = named_content;
-       named_content = content;
+       saved_content = get_named_content_ptr();
+       get_named_content_ptr() = content;
 }
 
 void Scene::GenericLoader::finish(bool)
 {
-       named_content = saved_content;
+       get_named_content_ptr() = saved_content;
 }
 
 } // namespace GL
index babda141a4af60d821ded23860f5106c51ec416a..6e35921c5827214a95f03bfdec178500b1bf05d6 100644 (file)
@@ -36,7 +36,7 @@ protected:
                unsigned inline_counter = 0;
 
        public:
-               Loader(Scene &s, Collection &c): Loader(s, c, named_content) { }
+               Loader(Scene &s, Collection &c): Loader(s, c, get_named_content_ptr()) { }
                Loader(Scene &s, Collection &c, ContentMap &m) : Loader(s, c, &m) { }
        private:
                Loader(Scene &, Collection &, ContentMap *);
@@ -49,7 +49,7 @@ protected:
        };
 
 public:
-       class GenericLoader: public DataFile::DynamicObjectLoader<Scene>
+       class MSPGL_API GenericLoader: public DataFile::DynamicObjectLoader<Scene>
        {
                friend class Scene;
 
@@ -58,7 +58,7 @@ public:
                ContentMap *saved_content = nullptr;
 
        public:
-               GenericLoader(DataFile::Collection &c): DynamicObjectLoader(&c), content(named_content) { }
+               GenericLoader(DataFile::Collection &c): DynamicObjectLoader(&c), content(get_named_content_ptr()) { }
                GenericLoader(DataFile::Collection &c, ContentMap &m): DynamicObjectLoader(&c), content(&m) { }
 
        protected:
@@ -68,9 +68,6 @@ public:
                void finish(bool) override;
        };
 
-private:
-       static thread_local ContentMap *named_content;
-
 protected:
        Scene() = default;
 public:
@@ -83,6 +80,7 @@ public:
        static void register_type(const std::string &);
 private:
        static GenericLoader::TypeRegistry &get_scene_registry();
+       static ContentMap *&get_named_content_ptr();
 };
 
 template<typename T>