Sauce-0.10.1
A C++ Dependency Injection Framework
provider.h
1#ifndef SAUCE_PROVIDER_H_
2#define SAUCE_PROVIDER_H_
3
4#include <cassert>
5
6#include <sauce/memory.h>
7#include <sauce/internal/disposal_deleter.h>
8#include <sauce/internal/key.h>
9
10namespace sauce {
11
12class Injector;
13
14template<typename Dependency>
15class Provider;
16
20template<typename Dependency>
21class Provider {
22public:
23
28
29 virtual ~Provider() {}
30
34 virtual typename i::Key<Dependency>::Ptr get() = 0;
35
36};
37
41template<typename Dependency>
42class AbstractProvider: public Provider<Dependency> {
43
44 typedef typename i::Key<Dependency>::Iface Iface;
47
48 friend class i::DisposalDeleter<Iface, Abstract>;
49
50 sauce::weak_ptr<Abstract> weak;
51
55 virtual Iface * provide() = 0;
56
60 virtual void dispose(Iface *) = 0;
61
62public:
63
65
66 virtual ~AbstractProvider() {}
67
68 void setSelf(sauce::weak_ptr<Abstract> weak) {
69 assert(weak.lock().get() == this);
70 this->weak = weak;
71 }
72
79 sauce::shared_ptr<Iface> get() {
80 sauce::shared_ptr<Abstract> self = weak.lock();
81 assert(self.get() == this);
82 Deleter deleter(sauce::static_pointer_cast<Abstract>(self));
83 return sauce::shared_ptr<Iface>(provide(), deleter);
84 }
85
86};
87
88}
89
90#endif // SAUCE_PROVIDER_H_
An interface for including custom factories in an Injector.
Definition: provider.h:42
sauce::shared_ptr< Iface > get()
Provide an Iface.
Definition: provider.h:79
An interface for including custom factories in an Injector.
Definition: provider.h:21
i::Key< Dependency >::Iface Provides
Indicates to template magic that this type exposes sauce::shared_ptr<Provides> get().
Definition: provider.h:27
virtual i::Key< Dependency >::Ptr get()=0
Provide an Iface.
A smart pointer deleter that diposes with the given disposal.
Definition: disposal_deleter.h:13
A complete specification of a dependency request.
Definition: key.h:15