VirtualResourceProvider.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "../ResourceProvider.hpp"
4 #include "../ResourceManagementSystem.hpp"
6 #include <memory>
7 
8 namespace iv
9 {
10 
16 {
17 public:
20 
21  VirtualResourceProvider( Instance * inst, size_t priority );
22 
23  template< class TVirtualSubprovider, class TClient, class TParserClient = TClient >
24  static void RegisterType();
25  static void UnregisterAllTypes();
26 
27 //--------------------------------------------- ResourceProvider -----------------------
28  virtual void each_type( std::function< void( std::type_index type ) > const & ) override;
29  virtual bool has_path( ResourcePath const & path, std::type_index type ) override;
30  virtual void each_resource( std::type_index type, std::function< void( ResourcePath const & ) > const & ) override;
31  virtual std::pair< void *, Instance * > create_resource( ResourcePath const & path, std::type_index type, ResourcesRoot * parent ) override;
32 
33 private:
34  class Marker
35  {
36  public:
37  virtual ~Marker(){}
38  virtual std::pair< void *, Instance * > MakeResource( VirtualResourceProvider *, ResourcesRoot *, ResourcePath const & ) const = 0;
39  virtual void EachResource( VirtualResourceProvider *, std::function< void( ResourcePath const & path ) > const & ) const = 0;
40  virtual bool HasResource( VirtualResourceProvider *, ResourcePath const & ) const = 0;
41  virtual std::type_index GetType() const = 0;
42  };
43 
44  template< class TVirtualSubprovider, class TClient, class TParserClient >
45  class TMarker : public Marker
46  {
47  public:
48  virtual std::pair< void *, Instance * > MakeResource( VirtualResourceProvider *, ResourcesRoot *, ResourcePath const & ) const override;
49  virtual void EachResource( VirtualResourceProvider *, std::function< void( ResourcePath const & path ) > const & ) const override;
50  virtual bool HasResource( VirtualResourceProvider *, ResourcePath const & ) const override;
51  virtual std::type_index GetType() const override;
52  private:
53  TVirtualSubprovider * GetSubprovider( VirtualResourceProvider * ) const;
54  };
55 
56  static std::unordered_multimap< std::type_index, std::unique_ptr< Marker > > * Markers;
57  mutable std::unordered_map< Marker const *, void * > subproviders;
58 
59  Heap heap;
60 };
61 
62 }
63