Gazebo Rendering

API Reference

8.2.0
BaseStorage.hh
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2015 Open Source Robotics Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17 #ifndef GZ_RENDERING_BASE_BASESTORAGE_HH_
18 #define GZ_RENDERING_BASE_BASESTORAGE_HH_
19 
20 #include <map>
21 #include <memory>
22 #include <string>
23 #include <vector>
24 
25 #include <gz/common/Console.hh>
26 #include <gz/utils/SuppressWarning.hh>
27 
28 #include "gz/rendering/Storage.hh"
29 
30 namespace gz
31 {
32  namespace rendering
33  {
34  inline namespace GZ_RENDERING_VERSION_NAMESPACE {
35  //
37  template <class T, class U>
38  class BaseMap :
39  public Map<T>
40  {
41  typedef std::shared_ptr<T> TPtr;
42 
44 
45  typedef std::shared_ptr<U> UPtr;
46 
48 
49  typedef typename UMap::iterator UIter;
50 
51  typedef typename UMap::const_iterator ConstUIter;
52 
53  public: BaseMap();
54 
55  public: virtual ~BaseMap();
56 
57  public: virtual unsigned int Size() const;
58 
59  public: virtual bool ContainsKey(const std::string &_key) const;
60 
61  public: virtual bool ContainsValue(ConstTPtr _value) const;
62 
63  GZ_UTILS_WARN_IGNORE__DLL_INTERFACE_MISSING
64  public: virtual TPtr Get(const std::string &_key) const;
65 
66  public: virtual TPtr GetByIndex(unsigned int _index) const;
67  GZ_UTILS_WARN_RESUME__DLL_INTERFACE_MISSING
68 
69  public: virtual bool Put(const std::string &_key, TPtr _value);
70 
71  public: virtual void Remove(const std::string &_key);
72 
73  public: virtual void Remove(TPtr _value);
74 
75  public: virtual void RemoveAll();
76 
77  public: virtual UPtr Derived(const std::string &_key) const;
78 
79  public: virtual UPtr DerivedByIndex(unsigned int _index) const;
80 
81  protected: virtual bool IsValidIter(ConstUIter _iter) const;
82 
83  protected: UMap map;
84  };
85 
87  template <class T, class U>
88  class BaseStore :
89  public Store<T>
90  {
91  typedef std::shared_ptr<T> TPtr;
92 
94 
95  typedef std::shared_ptr<U> UPtr;
96 
98  typedef std::vector<UPtr> UStore;
99 
100  typedef typename UStore::iterator UIter;
101 
102  typedef typename UStore::const_iterator ConstUIter;
103 
104  public: BaseStore();
105 
106  public: virtual ~BaseStore();
107 
108  public: virtual unsigned int Size() const;
109 
110  public: virtual bool Contains(ConstTPtr _object) const;
111 
112  public: virtual bool ContainsId(unsigned int _id) const;
113 
114  public: virtual bool ContainsName(const std::string &_name) const;
115 
116  public: virtual TPtr GetById(unsigned int _id) const;
117 
118  public: virtual TPtr GetByName(const std::string &_name) const;
119 
120  public: virtual TPtr GetByIndex(unsigned int _index) const;
121 
122  public: virtual bool Add(TPtr _object);
123 
124  public: virtual TPtr Remove(TPtr _object);
125 
126  public: virtual TPtr RemoveById(unsigned int _id);
127 
128  public: virtual TPtr RemoveByName(const std::string &_name);
129 
130  public: virtual TPtr RemoveByIndex(unsigned int _index);
131 
132  public: virtual void RemoveAll();
133 
134  public: virtual void Destroy(TPtr _object);
135 
136  public: virtual void DestroyById(unsigned int _id);
137 
138  public: virtual void DestroyByName(const std::string &_name);
139 
140  public: virtual void DestroyByIndex(unsigned int _index);
141 
142  public: virtual void DestroyAll();
143 
144  public: virtual UPtr DerivedById(unsigned int _id) const;
145 
146  public: virtual UPtr DerivedByName(const std::string &_name) const;
147 
148  public: virtual UPtr DerivedByIndex(unsigned int _index) const;
149 
150  public: virtual bool AddDerived(UPtr _object);
151 
152  public: virtual UPtr RemoveDerived(UPtr _object);
153 
154  public: virtual UPtr RemoveDerivedById(unsigned int _id);
155 
156  public: virtual UPtr RemoveDerivedByName(const std::string &_name);
157 
158  public: virtual UPtr RemoveDerivedByIndex(unsigned int _index);
159 
162  public: virtual UIter Begin();
163 
166  public: virtual UIter End();
167 
173  protected: virtual ConstUIter ConstIter(ConstTPtr _object) const;
174 
180  protected: virtual ConstUIter ConstIterById(unsigned int _id) const;
181 
187  protected: virtual ConstUIter ConstIterByName(
188  const std::string &_name) const;
189 
195  protected: virtual ConstUIter ConstIterByIndex(unsigned int _index) const;
196 
202  protected: virtual UIter Iter(ConstTPtr _object);
203 
209  protected: virtual UIter IterById(unsigned int _id);
210 
216  protected: virtual UIter IterByName(const std::string &_name);
217 
223  protected: virtual UIter IterByIndex(unsigned int _index);
224 
225  protected: virtual bool AddImpl(UPtr _object);
226 
227  protected: virtual UPtr RemoveImpl(UIter _iter);
228 
229  protected: virtual void DestroyImpl(UIter _iter);
230 
231  protected: virtual bool IsValidIter(ConstUIter _iter) const;
232 
233  protected: virtual UIter RemoveConstness(ConstUIter _iter);
234 
235  protected: UStore store;
236  protected: UStoreMap storeMap;
237  };
238 
240  template <class T>
242  public CompositeStore<T>
243  {
244  typedef std::shared_ptr<T> TPtr;
245 
247 
248  typedef Store<T> TStore;
249 
251 
253 
255 
256  typedef typename TStoreList::iterator TStoreIter;
257 
259 
260  public: virtual ~BaseCompositeStore();
261 
262  public: virtual unsigned int Size() const;
263 
264  public: virtual bool Contains(ConstTPtr _object) const;
265 
266  public: virtual bool ContainsId(unsigned int _id) const;
267 
268  public: virtual bool ContainsName(const std::string &_name) const;
269 
270  public: virtual TPtr GetById(unsigned int _id) const;
271 
272  public: virtual TPtr GetByName(const std::string &_name) const;
273 
274  public: virtual TPtr GetByIndex(unsigned int _index) const;
275 
276  public: virtual bool Add(TPtr _object);
277 
278  public: virtual TPtr Remove(TPtr _object);
279 
280  public: virtual TPtr RemoveById(unsigned int _id);
281 
282  public: virtual TPtr RemoveByName(const std::string &_name);
283 
284  public: virtual TPtr RemoveByIndex(unsigned int _index);
285 
286  public: virtual void RemoveAll();
287 
288  public: virtual void Destroy(TPtr _object);
289 
290  public: virtual void DestroyById(unsigned int _id);
291 
292  public: virtual void DestroyByName(const std::string &_name);
293 
294  public: virtual void DestroyByIndex(unsigned int _index);
295 
296  public: virtual void DestroyAll();
297 
298  public: virtual unsigned int GetStoreCount() const;
299 
300  public: virtual bool ContainsStore(ConstTStorePtr _store) const;
301 
302  public: virtual TStorePtr GetStore(unsigned int _index) const;
303 
304  public: virtual bool AddStore(TStorePtr _store);
305 
306  public: virtual TStorePtr RemoveStore(TStorePtr _store);
307 
308  public: virtual TStorePtr RemoveStore(unsigned int _index);
309 
310  public: virtual TStorePtr RemoveStoreImpl(TStoreIter _iter);
311 
312  GZ_UTILS_WARN_IGNORE__DLL_INTERFACE_MISSING
313  protected: TStoreList stores;
314  GZ_UTILS_WARN_RESUME__DLL_INTERFACE_MISSING
315  };
316 
318  template <class T, class U>
320  public StoreWrapper<T, U>
321  {
322  typedef std::shared_ptr<T> TPtr;
323 
325 
326  typedef std::shared_ptr<U> UPtr;
327 
329 
330  typedef Store<U> UStore;
331 
333 
334  public: explicit BaseStoreWrapper(UStorePtr _store);
335 
336  public: virtual ~BaseStoreWrapper();
337 
338  public: virtual unsigned int Size() const;
339 
340  public: virtual bool Contains(ConstTPtr _object) const;
341 
342  public: virtual bool ContainsId(unsigned int _id) const;
343 
344  public: virtual bool ContainsName(const std::string &_name) const;
345 
346  public: virtual TPtr GetById(unsigned int _id) const;
347 
348  public: virtual TPtr GetByName(const std::string &_name) const;
349 
350  public: virtual TPtr GetByIndex(unsigned int _index) const;
351 
352  public: virtual bool Add(TPtr _object);
353 
354  public: virtual TPtr Remove(TPtr _object);
355 
356  public: virtual TPtr RemoveById(unsigned int _id);
357 
358  public: virtual TPtr RemoveByName(const std::string &_name);
359 
360  public: virtual TPtr RemoveByIndex(unsigned int _index);
361 
362  public: virtual void RemoveAll();
363 
364  public: virtual void Destroy(TPtr _object);
365 
366  public: virtual void DestroyById(unsigned int _id);
367 
368  public: virtual void DestroyByName(const std::string &_name);
369 
370  public: virtual void DestroyByIndex(unsigned int _index);
371 
372  public: virtual void DestroyAll();
373 
374  protected: UStorePtr store;
375  };
376 
379  public BaseCompositeStore<Node>
380  {
381  };
382 
383  template <class T>
385  public BaseStore<Scene, T>
386  {
387  };
388 
389  template <class T>
391  public BaseStore<Node, T>
392  {
393  };
394 
395  template <class T>
397  public BaseStore<Light, T>
398  {
399  };
400 
401  template <class T>
403  public BaseStore<Sensor, T>
404  {
405  };
406 
407  template <class T>
409  public BaseStore<Visual, T>
410  {
411  };
412 
413  template <class T>
415  public BaseStore<Geometry, T>
416  {
417  };
418 
419  template <class T>
421  public BaseStore<SubMesh, T>
422  {
423  };
424 
425  template <class T>
427  public BaseMap<Material, T>
428  {
429  };
430 
432  template <class T, class U>
434  {
435  }
436 
438  template <class T, class U>
440  {
441  }
442 
444  template <class T, class U>
445  unsigned int BaseMap<T, U>::Size() const
446  {
447  return this->map.size();
448  }
449 
451  template <class T, class U>
452  bool BaseMap<T, U>::ContainsKey(const std::string &_key) const
453  {
454  return this->map.count(_key) > 0;
455  }
456 
458  template <class T, class U>
460  {
461  for (auto pair : this->map)
462  {
463  if (pair.second == _value) return true;
464  }
465 
466  return false;
467  }
468 
470  template <class T, class U>
471  typename BaseMap<T, U>::TPtr
472  BaseMap<T, U>::Get(const std::string &_key) const
473  {
474  return this->Derived(_key);
475  }
476 
478  template <class T, class U>
479  typename BaseMap<T, U>::TPtr
480  BaseMap<T, U>::GetByIndex(unsigned int _index) const
481  {
482  return this->DerivedByIndex(_index);
483  }
484 
486  template <class T, class U>
487  bool BaseMap<T, U>::Put(const std::string &_key, TPtr _value)
488  {
489  if (_key.empty())
490  {
491  gzerr << "Cannot store item with empty key" << std::endl;
492  return false;
493  }
494 
495  if (!_value)
496  {
497  gzerr << "Cannot store null pointer value" << std::endl;
498  return false;
499  }
500 
501  if (this->ContainsKey(_key))
502  {
503  gzerr << "Item already registered with key: " << _key << std::endl;
504  return false;
505  }
506 
507  UPtr derived = std::dynamic_pointer_cast<U>(_value);
508 
509  if (!derived)
510  {
511  gzerr << "Cannot add item created by another render-engine"
512  << std::endl;
513 
514  return false;
515  }
516 
517  this->map[_key] = derived;
518  return true;
519  }
520 
522  template <class T, class U>
524  {
525  auto iter = this->map.find(_key);
526 
527  if (this->IsValidIter(iter))
528  {
529  this->map.erase(iter);
530  }
531  }
532 
534  template <class T, class U>
536  {
537  auto iter = this->map.begin();
538 
539  while (this->IsValidIter(iter))
540  {
541  if (iter->second == _value)
542  {
543  this->map.erase(iter);
544  continue;
545  }
546 
547  ++iter;
548  }
549  }
550 
552  template <class T, class U>
554  {
555  this->map.clear();
556  }
557 
559  template <class T, class U>
560  typename BaseMap<T, U>::UPtr
562  {
563  auto iter = this->map.find(_key);
564  return (this->IsValidIter(iter)) ? iter->second : nullptr;
565  }
566 
568  template <class T, class U>
569  typename BaseMap<T, U>::UPtr
570  BaseMap<T, U>::DerivedByIndex(unsigned int _index) const
571  {
572  if (_index >= this->Size())
573  {
574  gzerr << "Invalid index: " << _index << std::endl;
575  return nullptr;
576  }
577 
578  auto iter = this->map.begin();
579  std::advance(iter, _index);
580  return iter->second;
581  }
582 
584  template <class T, class U>
585  bool BaseMap<T, U>::IsValidIter(ConstUIter _iter) const
586  {
587  return _iter != this->map.end();
588  }
589 
591  template <class T, class U>
593  {
594  }
595 
597  template <class T, class U>
599  {
600  }
601 
603  template <class T, class U>
604  unsigned int BaseStore<T, U>::Size() const
605  {
606  return this->store.size();
607  }
608 
610  template <class T, class U>
611  typename BaseStore<T, U>::UIter
613  {
614  return this->store.begin();
615  }
616 
618  template <class T, class U>
619  typename BaseStore<T, U>::UIter
621  {
622  return this->store.end();
623  }
624 
626  template <class T, class U>
628  {
629  auto iter = this->ConstIter(_object);
630  return this->IsValidIter(iter);
631  }
632 
634  template <class T, class U>
635  bool BaseStore<T, U>::ContainsId(unsigned int _id) const
636  {
637  auto iter = this->ConstIterById(_id);
638  return this->IsValidIter(iter);
639  }
640 
642  template <class T, class U>
644  {
645  auto iter = this->ConstIterByName(_name);
646  return this->IsValidIter(iter);
647  }
648 
650  template <class T, class U>
651  typename BaseStore<T, U>::TPtr
652  BaseStore<T, U>::GetById(unsigned int _id) const
653  {
654  return this->DerivedById(_id);
655  }
656 
658  template <class T, class U>
659  typename BaseStore<T, U>::TPtr
661  {
662  return this->DerivedByName(_name);
663  }
664 
666  template <class T, class U>
667  typename BaseStore<T, U>::TPtr
668  BaseStore<T, U>::GetByIndex(unsigned int _index) const
669  {
670  return this->DerivedByIndex(_index);
671  }
672 
674  template <class T, class U>
676  {
677  if (!_object)
678  {
679  gzerr << "Cannot add null pointer" << std::endl;
680  return false;
681  }
682 
683  UPtr derived = std::dynamic_pointer_cast<U>(_object);
684 
685  if (!derived)
686  {
687  gzerr << "Cannot add item created by another render-engine"
688  << std::endl;
689 
690  return false;
691  }
692 
693  return this->AddImpl(derived);
694  }
695 
697  template <class T, class U>
698  typename BaseStore<T, U>::TPtr
700  {
701  auto iter = this->Iter(_object);
702  return this->RemoveImpl(iter);
703  }
704 
706  template <class T, class U>
707  typename BaseStore<T, U>::TPtr
708  BaseStore<T, U>::RemoveById(unsigned int _id)
709  {
710  return this->RemoveDerivedById(_id);
711  }
712 
714  template <class T, class U>
715  typename BaseStore<T, U>::TPtr
717  {
718  return this->RemoveDerivedByName(_name);
719  }
720 
722  template <class T, class U>
723  typename BaseStore<T, U>::TPtr
724  BaseStore<T, U>::RemoveByIndex(unsigned int _index)
725  {
726  return this->RemoveDerivedByIndex(_index);
727  }
728 
730  template <class T, class U>
732  {
733  this->store.clear();
734  this->storeMap.clear();
735  }
736 
738  template <class T, class U>
740  {
741  auto iter = this->Iter(_object);
742  this->DestroyImpl(iter);
743  }
744 
746  template <class T, class U>
747  void BaseStore<T, U>::DestroyById(unsigned int _id)
748  {
749  auto iter = this->IterById(_id);
750  this->DestroyImpl(iter);
751  }
752 
754  template <class T, class U>
756  {
757  auto iter = this->IterByName(_name);
758  this->DestroyImpl(iter);
759  }
760 
762  template <class T, class U>
763  void BaseStore<T, U>::DestroyByIndex(unsigned int _index)
764  {
765  auto iter = this->IterByIndex(_index);
766  this->DestroyImpl(iter);
767  }
768 
770  template <class T, class U>
772  {
773  unsigned int i = this->Size();
774 
775  while (i > 0)
776  {
777  this->DestroyByIndex(--i);
778  }
779  }
780 
782  template <class T, class U>
783  typename BaseStore<T, U>::UPtr
784  BaseStore<T, U>::DerivedById(unsigned int _id) const
785  {
786  auto iter = this->ConstIterById(_id);
787  return (this->IsValidIter(iter)) ? *iter : nullptr;
788  }
789 
791  template <class T, class U>
792  typename BaseStore<T, U>::UPtr
794  {
795  auto iter = this->ConstIterByName(_name);
796  return (this->IsValidIter(iter)) ? *iter : nullptr;
797  }
798 
800  template <class T, class U>
801  typename BaseStore<T, U>::UPtr
802  BaseStore<T, U>::DerivedByIndex(unsigned int _index) const
803  {
804  auto iter = this->ConstIterByIndex(_index);
805  return (this->IsValidIter(iter)) ? *iter : nullptr;
806  }
807 
809  template <class T, class U>
811  {
812  if (!_object)
813  {
814  gzerr << "Cannot add null pointer" << std::endl;
815  return false;
816  }
817 
818  return this->AddImpl(_object);
819  }
820 
822  template <class T, class U>
823  typename BaseStore<T, U>::UPtr
825  {
826  auto iter = this->Iter(_object);
827  return this->RemoveImpl(iter);
828  }
829 
831  template <class T, class U>
832  typename BaseStore<T, U>::UPtr
834  {
835  auto iter = this->IterById(_id);
836  return this->RemoveImpl(iter);
837  }
838 
840  template <class T, class U>
841  typename BaseStore<T, U>::UPtr
843  {
844  auto iter = this->IterByName(_name);
845  return this->RemoveImpl(iter);
846  }
847 
849  template <class T, class U>
850  typename BaseStore<T, U>::UPtr
852  {
853  auto iter = this->IterByIndex(_index);
854  return this->RemoveImpl(iter);
855  }
856 
858  template <class T, class U>
859  typename BaseStore<T, U>::ConstUIter
861  {
862  auto begin = this->store.begin();
863  auto end = this->store.end();
864 
865  for (auto iter = begin; iter != end; ++iter)
866  {
867  if (*iter == _object)
868  {
869  return iter;
870  }
871  }
872 
873  return end;
874  }
875 
877  template <class T, class U>
878  typename BaseStore<T, U>::ConstUIter
879  BaseStore<T, U>::ConstIterById(unsigned int _id) const
880  {
881  auto begin = this->store.begin();
882  auto end = this->store.end();
883 
884  for (auto iter = begin; iter != end; ++iter)
885  {
886  if ((*iter)->Id() == _id)
887  {
888  return iter;
889  }
890  }
891 
892  return end;
893  }
894 
896  template <class T, class U>
897  typename BaseStore<T, U>::ConstUIter
899  {
900  auto idx = this->storeMap.find(_name);
901  if (idx == this->storeMap.end())
902  {
903  return this->store.end();
904  }
905  return ConstIterByIndex(idx->second);
906  }
907 
909  template <class T, class U>
910  typename BaseStore<T, U>::ConstUIter
911  BaseStore<T, U>::ConstIterByIndex(unsigned int _index) const
912  {
913  if (_index >= this->Size())
914  {
915  gzerr << "Invalid index: " << _index << std::endl;
916  return this->store.end();
917  }
918 
919  auto iter = this->store.begin();
920  std::advance(iter, _index);
921  return iter;
922  }
923 
925  template <class T, class U>
926  typename BaseStore<T, U>::UIter
928  {
929  auto iter = this->ConstIter(_object);
930  return this->RemoveConstness(iter);
931  }
932 
934  template <class T, class U>
935  typename BaseStore<T, U>::UIter
936  BaseStore<T, U>::IterById(unsigned int _id)
937  {
938  auto iter = this->ConstIterById(_id);
939  return this->RemoveConstness(iter);
940  }
941 
943  template <class T, class U>
944  typename BaseStore<T, U>::UIter
946  {
947  auto iter = this->ConstIterByName(_name);
948  return this->RemoveConstness(iter);
949  }
950 
952  template <class T, class U>
953  typename BaseStore<T, U>::UIter
954  BaseStore<T, U>::IterByIndex(unsigned int _index)
955  {
956  auto iter = this->ConstIterByIndex(_index);
957  return this->RemoveConstness(iter);
958  }
959 
961  template <class T, class U>
963  {
964  unsigned int id = _object->Id();
965  std::string name = _object->Name();
966 
967  if (this->ContainsId(id))
968  {
969  gzerr << "Another item already exists with id: " << id << std::endl;
970  return false;
971  }
972 
973  if (this->ContainsName(name))
974  {
975  gzerr << "Another item already exists with name: " << name
976  << std::endl;
977  return false;
978  }
979 
980  this->storeMap[name] = this->store.size();
981  this->store.emplace_back(_object);
982  return true;
983  }
984 
986  template <class T, class U>
987  typename BaseStore<T, U>::UPtr
989  {
990  if (!this->IsValidIter(_iter))
991  {
992  return nullptr;
993  }
994 
995 
996  auto idx = std::distance(this->store.begin(), _iter);
997  std::string nameToErase;
998  for (auto &[name, objIdx] : this->storeMap)
999  {
1000  if (objIdx == idx)
1001  nameToErase = name;
1002 
1003  if (objIdx >= idx)
1004  objIdx--;
1005  }
1006  this->storeMap.erase(nameToErase);
1007 
1008  UPtr result = *_iter;
1009  this->store.erase(_iter);
1010  return result;
1011  }
1012 
1014  template <class T, class U>
1016  {
1017  UPtr result = this->RemoveImpl(_iter);
1018  if (result) result->Destroy();
1019  }
1020 
1022  template <class T, class U>
1023  bool BaseStore<T, U>::IsValidIter(ConstUIter _iter) const
1024  {
1025  return _iter != this->store.end();
1026  }
1027 
1029  template <class T, class U>
1030  typename BaseStore<T, U>::UIter
1032  {
1033  return (this->IsValidIter(_iter)) ?
1034  this->store.erase(_iter, _iter) : this->store.end();
1035  }
1036 
1038  template <class T>
1040  {
1041  }
1042 
1044  template <class T>
1046  {
1047  }
1048 
1050  template <class T>
1051  unsigned int BaseCompositeStore<T>::Size() const
1052  {
1053  unsigned int size = 0;
1054 
1055  for (auto store : this->stores)
1056  {
1057  size += store->Size();
1058  }
1059 
1060  return size;
1061  }
1062 
1064  template <class T>
1066  {
1067  for (auto store : this->stores)
1068  {
1069  if (store->Contains(_object)) return true;
1070  }
1071 
1072  return false;
1073  }
1074 
1076  template <class T>
1077  bool BaseCompositeStore<T>::ContainsId(unsigned int _id) const
1078  {
1079  for (auto store : this->stores)
1080  {
1081  if (store->ContainsId(_id)) return true;
1082  }
1083 
1084  return false;
1085  }
1086 
1088  template <class T>
1090  {
1091  for (auto store : this->stores)
1092  {
1093  if (store->ContainsName(_name)) return true;
1094  }
1095 
1096  return false;
1097  }
1098 
1100  template <class T>
1102  BaseCompositeStore<T>::GetById(unsigned int _id) const
1103  {
1104  for (auto store : this->stores)
1105  {
1106  TPtr object = store->GetById(_id);
1107  if (object) return object;
1108  }
1109 
1110  return nullptr;
1111  }
1112 
1114  template <class T>
1117  {
1118  for (auto store : this->stores)
1119  {
1120  TPtr object = store->GetByName(_name);
1121  if (object) return object;
1122  }
1123 
1124  return nullptr;
1125  }
1126 
1128  template <class T>
1130  BaseCompositeStore<T>::GetByIndex(unsigned int _index) const
1131  {
1132  unsigned int origIndex = _index;
1133 
1134  for (auto store : this->stores)
1135  {
1136  unsigned int size = store->Size();
1137  if (_index < size)
1138  return store->GetByIndex(_index);
1139  _index -= size;
1140  }
1141 
1142  gzerr << "Invalid index: " << origIndex << std::endl;
1143  return nullptr;
1144  }
1145 
1147  template <class T>
1149  {
1150  gzerr << "Adding to BaseCompositeStore not supported" << std::endl;
1151  return false;
1152  }
1153 
1155  template <class T>
1158  {
1159  TPtr result = nullptr;
1160 
1161  for (auto store : this->stores)
1162  {
1163  TPtr temp = store->Remove(_object);
1164  if (!result) result = temp;
1165  }
1166 
1167  return result;
1168  }
1169 
1171  template <class T>
1174  {
1175  TPtr result = nullptr;
1176 
1177  for (auto store : this->stores)
1178  {
1179  TPtr temp = store->RemoveById(_id);
1180  if (!result) result = temp;
1181  }
1182 
1183  return result;
1184  }
1185 
1187  template <class T>
1190  {
1191  TPtr result = nullptr;
1192 
1193  for (auto store : this->stores)
1194  {
1195  TPtr temp = store->RemoveByName(_name);
1196  if (!result) result = temp;
1197  }
1198 
1199  return result;
1200  }
1201 
1203  template <class T>
1206  {
1207  TPtr result = nullptr;
1208 
1209  for (auto store : this->stores)
1210  {
1211  TPtr temp = store->RemoveByIndex(_index);
1212  if (!result) result = temp;
1213  }
1214 
1215  return result;
1216  }
1217 
1219  template <class T>
1221  {
1222  for (auto store : this->stores)
1223  {
1224  store->RemoveAll();
1225  }
1226  }
1227 
1229  template <class T>
1231  {
1232  for (auto store : this->stores)
1233  {
1234  if (store->Contains(_object))
1235  {
1236  store->Destroy(_object);
1237  return;
1238  }
1239  }
1240  }
1241 
1243  template <class T>
1244  void BaseCompositeStore<T>::DestroyById(unsigned int _id)
1245  {
1246  for (auto store : this->stores)
1247  {
1248  store->DestroyById(_id);
1249  }
1250  }
1251 
1253  template <class T>
1255  {
1256  for (auto store : this->stores)
1257  {
1258  store->DestroyByName(_name);
1259  }
1260  }
1261 
1263  template <class T>
1264  void BaseCompositeStore<T>::DestroyByIndex(unsigned int _index)
1265  {
1266  for (auto store : this->stores)
1267  {
1268  store->DestroyByIndex(_index);
1269  }
1270  }
1271 
1273  template <class T>
1275  {
1276  for (auto store : this->stores)
1277  {
1278  store->DestroyAll();
1279  }
1280  }
1281 
1283  template <class T>
1285  {
1286  return this->stores.size();
1287  }
1288 
1290  template <class T>
1292  {
1293  auto begin = this->stores.begin();
1294  auto end = this->stores.end();
1295  auto iter = std::find(begin, end, _store);
1296  return iter != end;
1297  }
1298 
1300  template <class T>
1302  BaseCompositeStore<T>::GetStore(unsigned int _index) const
1303  {
1304  if (_index >= this->GetStoreCount())
1305  {
1306  gzerr << "Invalid store index: " << _index << std::endl;
1307  return nullptr;
1308  }
1309 
1310  return this->stores[_index];
1311  }
1312 
1314  template <class T>
1316  {
1317  if (!_store)
1318  {
1319  gzerr << "Cannot all null store pointer" << std::endl;
1320  return false;
1321  }
1322 
1323  if (this->ContainsStore(_store))
1324  {
1325  gzerr << "Store has already been added" << std::endl;
1326  return false;
1327  }
1328 
1329  this->stores.push_back(_store);
1330  return true;
1331  }
1332 
1334  template <class T>
1337  {
1338  auto begin = this->stores.begin();
1339  auto end = this->stores.end();
1340  auto iter = std::find(begin, end, _store);
1341  return this->RemoveStoreImpl(iter);
1342  }
1343 
1345  template <class T>
1348  {
1349  if (_index >= this->GetStoreCount())
1350  {
1351  gzerr << "Invalid store index: " << _index << std::endl;
1352  return nullptr;
1353  }
1354 
1355  auto iter = this->stores.begin();
1356  std::advance(iter, _index);
1357  return this->RemoveStoreImpl(iter);
1358  }
1359 
1361  template <class T>
1364  {
1365  if (_iter == this->stores.end())
1366  {
1367  return nullptr;
1368  }
1369 
1370  TStorePtr result = *_iter;
1371  this->stores.erase(_iter);
1372  return result;
1373  }
1374 
1376  template <class T, class U>
1378  store(_store)
1379  {
1380  }
1381 
1383  template <class T, class U>
1385  {
1386  }
1387 
1389  template <class T, class U>
1390  unsigned int BaseStoreWrapper<T, U>::Size() const
1391  {
1392  return this->store->Size();
1393  }
1394 
1396  template <class T, class U>
1398  {
1399  ConstUPtr derived = std::dynamic_pointer_cast<const U>(_object);
1400  return this->store->Contains(derived);
1401  }
1402 
1404  template <class T, class U>
1405  bool BaseStoreWrapper<T, U>::ContainsId(unsigned int _id) const
1406  {
1407  return this->store->ContainsId(_id);
1408  }
1409 
1411  template <class T, class U>
1413  {
1414  return this->store->ContainsName(_name);
1415  }
1416 
1418  template <class T, class U>
1420  BaseStoreWrapper<T, U>::GetById(unsigned int _id) const
1421  {
1422  return this->store->GetById(_id);
1423  }
1424 
1426  template <class T, class U>
1429  {
1430  return this->store->GetByName(_name);
1431  }
1432 
1434  template <class T, class U>
1436  BaseStoreWrapper<T, U>::GetByIndex(unsigned int _index) const
1437  {
1438  return this->store->GetByIndex(_index);
1439  }
1440 
1442  template <class T, class U>
1444  {
1445  UPtr derived = std::dynamic_pointer_cast<U>(_object);
1446  return this->store->Add(derived);
1447  }
1448 
1450  template <class T, class U>
1453  {
1454  UPtr derived = std::dynamic_pointer_cast<U>(_object);
1455  return this->store->Remove(derived);
1456  }
1457 
1459  template <class T, class U>
1462  {
1463  return this->store->RemoveById(_id);
1464  }
1465 
1467  template <class T, class U>
1470  {
1471  return this->store->RemoveByName(_name);
1472  }
1473 
1475  template <class T, class U>
1478  {
1479  return this->store->RemoveByIndex(_index);
1480  }
1481 
1483  template <class T, class U>
1485  {
1486  this->store->RemoveAll();
1487  }
1488 
1490  template <class T, class U>
1492  {
1493  UPtr derived = std::dynamic_pointer_cast<U>(_object);
1494  this->store->Destroy(derived);
1495  }
1496 
1498  template <class T, class U>
1500  {
1501  this->store->DestroyById(_id);
1502  }
1503 
1505  template <class T, class U>
1507  {
1508  this->store->DestroyByName(_name);
1509  }
1510 
1512  template <class T, class U>
1513  void BaseStoreWrapper<T, U>::DestroyByIndex(unsigned int _index)
1514  {
1515  this->store->DestroyByIndex(_index);
1516  }
1517 
1519  template <class T, class U>
1521  {
1522  this->store->DestroyAll();
1523  }
1524  }
1525  }
1526 }
1527 #endif