StreamResourceProvider.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "../ResourceProvider.hpp"
4 #include "../ResourceManagementSystem.hpp"
5 
7 
8 #include <unordered_map>
9 #include <memory>
10 
11 namespace iv
12 {
13 
14 class StreamResourceProvider;
15 
19 {
20 public:
22  StreamResource( Instance * inst, StreamResourceProvider const * provider, ResourcePath const & path );
23  Instance * instance() const;
24  void status( iv::TableDebugView * view );
25 
26  void with_resource_stream( std::function< void( std::istream & ) > const & ) const;
28 
29 private:
30  Instance * inst;
31  StreamResourceProvider const * provider;
32  ResourcePath path;
33 };
34 
38 {
39 public:
42  StreamResourceProvider( Instance * inst, size_t priority );
43 
44  virtual void with_metadata_stream( std::function< void( std::istream & ) > const & ) const = 0;
45  virtual void with_stream( ResourcePath const & path, std::function< void( std::istream & ) > const & ) const = 0;
46 
47  template< class TStreamSubprovider, class TClient, class TParserClient = TClient >
48  static void RegisterType();
49  static void UnregisterAllTypes();
50 
51 private:
52 //------------------------- ResourceProvider -----------------------
53  virtual void each_type( std::function< void( std::type_index type ) > const & ) override;
54  virtual bool has_path( ResourcePath const & path, std::type_index type ) override;
55  virtual void each_resource( std::type_index type, std::function< void( ResourcePath const & ) > const & ) override;
56  virtual std::pair< void *, Instance * > create_resource( ResourcePath const & path, std::type_index type, ResourcesRoot * parent ) override;
57 
58 private:
59  class Marker
60  {
61  public:
62  virtual ~Marker(){}
63  virtual std::pair< void *, Instance * > MakeResource( StreamResourceProvider *, ResourcesRoot *, ResourcePath const & ) const = 0;
64  virtual void EachResource( StreamResourceProvider *, std::function< void( ResourcePath const & path ) > const & ) const = 0;
65  virtual bool HasResource( StreamResourceProvider *, ResourcePath const & ) const = 0;
66  virtual std::type_index GetType() const = 0;
67  };
68 
69  template< class TStreamSubprovider, class TClient, class TParserClient >
70  class TMarker : public Marker
71  {
72  public:
73  virtual std::pair< void *, Instance * > MakeResource( StreamResourceProvider *, ResourcesRoot *, ResourcePath const & ) const override;
74  virtual void EachResource( StreamResourceProvider *, std::function< void( ResourcePath const & path ) > const & ) const override;
75  virtual bool HasResource( StreamResourceProvider *, ResourcePath const & ) const override;
76  virtual std::type_index GetType() const override;
77  private:
78  TStreamSubprovider * GetSubprovider( StreamResourceProvider * ) const;
79  };
80 
81  static std::unordered_multimap< std::type_index, std::unique_ptr< Marker > > * Markers;
82  mutable std::unordered_map< Marker const *, void * > subproviders;
83 
84  Heap heap;
85 };
86 
87 }
88