diff options
-rw-r--r-- | project2/common/scriptLoader.cpp | 9 | ||||
-rw-r--r-- | project2/common/scriptLoader.h | 1 | ||||
-rw-r--r-- | project2/common/scriptStorage.h | 4 |
3 files changed, 11 insertions, 3 deletions
diff --git a/project2/common/scriptLoader.cpp b/project2/common/scriptLoader.cpp index bd6495b..1f5243e 100644 --- a/project2/common/scriptLoader.cpp +++ b/project2/common/scriptLoader.cpp @@ -99,18 +99,21 @@ LoaderBase::collectAll(ScriptNodePtr node, bool childrenOnly, const StorerPtrs & catch (const NotSupported &) { } } + if (!node->obj) { + throw NotSupported(node->get_name()); + } } else { if (SourceObjectPtr p = boost::dynamic_pointer_cast<SourceObject>(node->obj)) { LoaderBase::loadedObjects.insert(p.get()); } } - if (!node->obj) { - throw NotSupported(node->get_name()); - } BOOST_FOREACH(const StorerPtr & s, sts) { if (s->save(node->obj, node)) { stored += 1; + if (!s->cacheable(node)) { + node->obj.reset(); + } break; } } diff --git a/project2/common/scriptLoader.h b/project2/common/scriptLoader.h index 2582a52..2b1057b 100644 --- a/project2/common/scriptLoader.h +++ b/project2/common/scriptLoader.h @@ -131,6 +131,7 @@ class ComponentLoader { virtual void onPeriodic(); // When the app engine feels like it virtual void onConfigLoad(); // When the environment reloads the configuration virtual const Options * options() const; // Options to be populated from the common config file/env/etc + virtual bool cacheable() const { return true; } // The component can be cached for next run }; template <class Impl, typename... Params> diff --git a/project2/common/scriptStorage.h b/project2/common/scriptStorage.h index 12cf3a6..2859a28 100644 --- a/project2/common/scriptStorage.h +++ b/project2/common/scriptStorage.h @@ -38,6 +38,7 @@ class Storer : public virtual IntrusivePtrBase { virtual boost::intrusive_ptr<IntrusivePtrBase> create(ScriptNodePtr) const = 0; virtual bool save(boost::intrusive_ptr<IntrusivePtrBase>, ScriptNodePtr) = 0; + virtual bool cacheable(ScriptNodePtr) const { return true; } }; template <class X, class L> @@ -51,6 +52,9 @@ class StorerBase : public Storer { boost::intrusive_ptr<IntrusivePtrBase> create(ScriptNodePtr p) const { return creator(LoaderBase::getLoader<L, NotSupported>(p->get_name()).get(), p); } + bool cacheable(ScriptNodePtr p) const { + return LoaderBase::getLoader<L, NotSupported>(p->get_name())->cacheable(); + } bool save(boost::intrusive_ptr<IntrusivePtrBase> o, ScriptNodePtr name) { boost::intrusive_ptr<X> O = boost::dynamic_pointer_cast<X>(o); if (O) { |