VirtualResourceProvider.inl
Go to the documentation of this file.
1 namespace iv
2 {
3 
4 template< class TVirtualSubprovider, class TClient, class TParserClient >
6 {
7  static_assert( std::is_base_of< TClient, TParserClient >::value, "TParserClient must inherit TClient." );
8 
9  // init directory
10  if( !Markers )
11  Markers = new std::unordered_multimap< std::type_index, std::unique_ptr< Marker > >;
12 
13  Markers->insert( std::pair< std::type_index, std::unique_ptr< Marker > >( typeid( TClient ), new TMarker< TVirtualSubprovider, TClient, TParserClient > ) );
14 }
15 
16 template< class TVirtualSubprovider, class TClient, class TParserClient >
17 std::pair< void *, Instance * > VirtualResourceProvider::TMarker< TVirtualSubprovider, TClient, TParserClient >::MakeResource( VirtualResourceProvider * provider, ResourcesRoot * root, ResourcePath const & path ) const
18 {
19  auto subprovider = this->GetSubprovider( provider );
20  //auto client = inst->createAndBindInstance< TParserClient >( (VirtualResourceProvider const *)provider, (TVirtualSubprovider const *)subprovider, path );
21  auto client = root->heap.create< I< TParserClient > >( "", root->instance(), (VirtualResourceProvider const *)provider, (TVirtualSubprovider const *)subprovider, path );
22  return std::pair( reinterpret_cast< void * >( static_cast< TClient * >( client ) ), client->instance() );
23 }
24 
25 template< class TVirtualSubprovider, class TClient, class TParserClient >
26 void VirtualResourceProvider::TMarker< TVirtualSubprovider, TClient, TParserClient >::EachResource( VirtualResourceProvider * provider, std::function< void( ResourcePath const & path ) > const & f ) const
27 {
28  auto subprovider = this->GetSubprovider( provider );
29  subprovider->each_resource( f );
30 }
31 
32 template< class TVirtualSubprovider, class TClient, class TParserClient >
33 bool VirtualResourceProvider::TMarker< TVirtualSubprovider, TClient, TParserClient >::HasResource( VirtualResourceProvider * provider, ResourcePath const & path ) const
34 {
35  auto subprovider = this->GetSubprovider( provider );
36  return subprovider->has_resource( path );
37 }
38 
39 template< class TVirtualSubprovider, class TClient, class TParserClient >
40 TVirtualSubprovider * VirtualResourceProvider::TMarker< TVirtualSubprovider, TClient, TParserClient >::GetSubprovider( VirtualResourceProvider * provider ) const
41 {
42  auto it = provider->subproviders.find( this );
43  if( it == provider->subproviders.end() )
44  {
45  it = provider->subproviders.insert(
46  std::pair(
47  this,
48  //provider->instance()->createAndBindInstance< TVirtualSubprovider >( static_cast< VirtualResourceProvider const * >( provider ) )
49  static_cast< TVirtualSubprovider * >( provider->heap.create< I< TVirtualSubprovider > >( "", provider->instance(), static_cast< VirtualResourceProvider const * >( provider ) ) )
50  )
51  ).first;
52  }
53 
54  return reinterpret_cast< TVirtualSubprovider * >( it->second );
55 }
56 
57 template< class TVirtualSubprovider, class TClient, class TParserClient >
58 std::type_index VirtualResourceProvider::TMarker< TVirtualSubprovider, TClient, TParserClient >::GetType() const
59 {
60  return typeid( TClient );
61 }
62 
63 }