Chain get_status to fallback collection if one is defined
authorMikko Rasa <tdb@tdb.fi>
Sat, 14 Nov 2015 17:05:03 +0000 (19:05 +0200)
committerMikko Rasa <tdb@tdb.fi>
Sat, 14 Nov 2015 17:14:34 +0000 (19:14 +0200)
source/collection.cpp
source/collection.h

index cffb7e2..3e9e4f1 100644 (file)
@@ -36,15 +36,9 @@ const Variant &Collection::get_var(const string &name, const CollectionItemTypeB
                        loaded = items.count(name);
                }
                if(!loaded && fallback)
-               {
-                       for(TypeList::const_iterator j=fallback->types.begin(); j!=fallback->types.end(); ++j)
-                               if((*j)->is_same_type(*type))
-                               {
-                                       if(fallback->get_status(name, **j))
-                                               return fallback->get_var(name, *j);
-                                       break;
-                               }
-               }
+                       if(CollectionItemTypeBase *fb_type = fallback->get_type(*type))
+                               if(fallback->get_status(name, *fb_type))
+                                       return fallback->get_var(name, fb_type);
        }
 
        return get_item(items, name);
@@ -73,12 +67,23 @@ unsigned Collection::get_status(const string &name, const CollectionItemTypeBase
                for(SourceList::const_iterator j=sources.begin(); j!=sources.end(); ++j)
                        if((*j)->is_loadable(type, name))
                                return 2;
+               if(fallback)
+                       if(CollectionItemTypeBase *fb_type = fallback->get_type(type))
+                               return fallback->get_status(name, *fb_type);
                return 0;
        }
 
        return type.check_item_type(i->second);
 }
 
+CollectionItemTypeBase *Collection::get_type(const CollectionItemTypeBase &type) const
+{
+       for(TypeList::const_iterator j=types.begin(); j!=types.end(); ++j)
+               if((*j)->is_same_type(type))
+                       return *j;
+       return 0;
+}
+
 CollectionItemTypeBase *Collection::get_type_for_item(const Variant &var) const
 {
        for(TypeList::const_iterator i=types.begin(); i!=types.end(); ++i)
index 174c7fc..50905ce 100644 (file)
@@ -255,6 +255,9 @@ private:
        template<typename T>
        CollectionItemTypeBase *get_type() const;
 
+       /// Gets a descriptor with the same type as another descriptor.
+       CollectionItemTypeBase *get_type(const CollectionItemTypeBase &) const;
+
        /// Returns the descriptor for an item, or null if it's of an unknown type.
        CollectionItemTypeBase *get_type_for_item(const Variant &) const;