Cornell Cocos
Cornell Extensions to Cocos2d
CUGenericLoader.h
1 //
2 // CUGenericLoader.h
3 // Cornell Extensions to Cocos2D
4 //
5 // This module provides a templated implementation of the Loader class to load
6 // any subclass of asset. Unlike the base loader, this class has a static
7 // coordinator behind the scenes to manage resources access scene. This is
8 // similar to the solutions for our other loaders. Hence we have a consistent
9 // loading framework with maximum flexibility.
10 //
11 // Author: Walker White
12 // Version: 1/20/16
13 //
14 #ifndef __CU_ASSET_LOADER__
15 #define __CU_ASSET_LOADER__
16 #include <unordered_set>
17 #include <mutex>
18 #include "CULoader.h"
19 #include "CUAsset.h"
20 #include "CUThreadPool.h"
21 
22 
23 NS_CC_BEGIN
24 
25 #pragma mark -
26 #pragma mark Abstract Base Class
27 
46 class CC_DLL GenericBaseLoader : public Loader<Asset> {
47 private:
49  CC_DISALLOW_COPY_AND_ASSIGN(GenericBaseLoader);
50 
51 protected:
52 #pragma mark -
53 #pragma mark Asset Coordinator
54 
60  class Coordinator {
61  private:
63  std::unordered_map<std::string,Asset*> _objects;
65  std::unordered_map<std::string, int> _refcnts;
67  std::unordered_map<std::string,std::vector<std::function<void(Asset* s)>>> _callbacks;
68 
70  ThreadPool* _threads;
72  std::mutex _mutex;
73 
74  public:
76  size_t instances;
77 
83  Coordinator();
84 
90  ~Coordinator();
91 
100  bool isLoaded(std::string id) const { return _objects.find(id) != _objects.end(); }
101 
110  bool isPending(std::string id) const { return _callbacks.find(id) != _callbacks.end(); }
111 
112 
113 #pragma mark Allocation Methods
114 
130  Asset* load(Asset* asset);
131 
149  void loadAsync(Asset* asset, std::function<void(Asset* s)> callback);
150 
164  Asset* allocate(Asset* asset);
165 
176  void release(Asset* asset);
177  };
178 
181 
182 
183 #pragma mark -
184 #pragma mark Asset Loader
185 
186  std::unordered_set<std::string> _aqueue;
187 
198  void allocate(std::string key, Asset* asset);
199 
200 
201 public:
202 #pragma mark Activation/Deactivation
203 
212  static GenericBaseLoader* create();
213 
225  void start() override;
226 
237  void stop() override;
238 
239 
240 #pragma mark Loading/Unloading
241 
251  size_t waitCount() const override { return _aqueue.size(); }
252 
257  Asset* load(std::string key, std::string source) override { return nullptr; }
258 
277  Asset* load(std::string key, Asset* asset);
278 
283  void loadAsync(std::string key, std::string source) override {}
284 
303  void loadAsync(std::string key, Asset* asset);
304 
316  void unload(std::string key) override;
317 
327  void unloadAll() override;
328 
329 
330 CC_CONSTRUCTOR_ACCESS:
331 #pragma mark Initializers
332 
335  GenericBaseLoader() : Loader<Asset>() {}
336 
342  virtual ~GenericBaseLoader() { if (_active) { stop(); } }
343 };
344 
345 
346 #pragma mark -
347 #pragma mark Asset Loader Template
348 
357 template <class T>
358 class GenericLoader : public Loader<T> {
359 protected:
362 
363 public:
374  GenericLoader<T> *loader = new (std::nothrow) GenericLoader<T>();
375  if (loader) {
376  loader->autorelease();
377  return loader;
378  }
379  CC_SAFE_DELETE(loader);
380  return nullptr;
381  }
382 
394  void start() override {
395  if (_internal->isActive()) {
396  return;
397  }
399  _internal->start();
400  }
401 
410  void stop() override {
411  if (!_internal->isActive()) {
412  return;
413  }
415  _internal->stop();
416  }
417 
418 
419 #pragma mark Loading/Unloading
420 
430  size_t waitCount() const override { return _internal->waitCount(); }
431 
441  size_t loadCount() const override { return _internal->loadCount(); }
442 
452  bool contains(std::string key) const override { return _internal->contains(key); }
453 
464  T* get(std::string key) const override {
465  Asset* asset = _internal->get(key);
466  return dynamic_cast<T*>(asset);
467  }
468 
482  T* load(std::string key, std::string source) override {
483  T* asset = T::create(source);
484  if (asset != nullptr) {
485  Asset* result = _internal->load(key,asset);
486  return dynamic_cast<T*>(result);
487  }
488  return nullptr;
489  }
490 
505  void loadAsync(std::string key, std::string source) override {
506  T* asset = T::create(source);
507  if (asset != nullptr) {
508  _internal->loadAsync(key,asset);
509  }
510  }
511 
523  void unload(std::string key) override { _internal->unload(key); }
524 
534  void unloadAll() override { _internal->unloadAll(); }
535 
536 
537 //CC_CONSTRUCTOR_ACCESS:
538 #pragma mark Initializers
539 
543  _internal = GenericBaseLoader::create();
544  _internal->retain();
545  }
546 
552  virtual ~GenericLoader() {
553  if (_internal->isActive()) { _internal->stop(); }
554  _internal->release();
555  _internal = nullptr;
556  }
557 };
558 
559 
560 NS_CC_END
561 
562 #endif /* defined(__CU_ASSET_LOADER__) */
virtual void start()
Definition: CULoader.h:66
size_t instances
Definition: CUGenericLoader.h:76
void unload(std::string key) override
Definition: CUGenericLoader.h:523
bool isPending(std::string id) const
Definition: CUGenericLoader.h:110
void start() override
Definition: CUGenericLoader.cpp:219
GenericLoader()
Definition: CUGenericLoader.h:542
Definition: CUGenericLoader.h:358
T * load(std::string key, std::string source) override
Definition: CUGenericLoader.h:482
virtual T * get(std::string key) const
Definition: CULoader.h:265
void unload(std::string key) override
Definition: CUGenericLoader.cpp:345
void loadAsync(std::string key, std::string source) override
Definition: CUGenericLoader.h:505
bool isLoaded(std::string id) const
Definition: CUGenericLoader.h:100
virtual size_t loadCount() const override
Definition: CULoader.h:293
void loadAsync(std::string key, std::string source) override
Definition: CUGenericLoader.h:283
Definition: CUGenericLoader.h:60
Definition: CUThreadPool.h:51
static Coordinator * _gCoordinator
Definition: CUGenericLoader.h:180
void start() override
Definition: CUGenericLoader.h:394
void unloadAll() override
Definition: CUGenericLoader.h:534
bool contains(std::string key) const override
Definition: CUGenericLoader.h:452
virtual bool contains(std::string key) const
Definition: CULoader.h:253
void unloadAll() override
Definition: CUGenericLoader.cpp:363
size_t waitCount() const override
Definition: CUGenericLoader.h:251
void stop() override
Definition: CUGenericLoader.h:410
virtual void unload(std::string key)
Definition: CULoader.h:125
Definition: CUGenericLoader.h:46
size_t waitCount() const override
Definition: CUGenericLoader.h:430
static GenericBaseLoader * create()
Definition: CUGenericLoader.cpp:198
virtual void unloadAll()
Definition: CULoader.h:138
GenericBaseLoader * _internal
Definition: CUGenericLoader.h:361
Asset * load(std::string key, std::string source) override
Definition: CUGenericLoader.h:257
Definition: CUAsset.h:39
std::unordered_set< std::string > _aqueue
Definition: CUGenericLoader.h:186
virtual ~GenericLoader()
Definition: CUGenericLoader.h:552
virtual void stop()
Definition: CULoader.h:82
Definition: CULoader.h:237
static GenericLoader< T > * create()
Definition: CUGenericLoader.h:373
virtual T * load(std::string key, std::string source)
Definition: CULoader.h:310
void stop() override
Definition: CUGenericLoader.cpp:242
bool isActive() const
Definition: CULoader.h:92
size_t loadCount() const override
Definition: CUGenericLoader.h:441
virtual void loadAsync(std::string key, std::string source)
Definition: CULoader.h:111