1 #ifndef SAUCE_INTERNAL_BINDINGS_H_
2 #define SAUCE_INTERNAL_BINDINGS_H_
9 #include <sauce/exceptions.h>
10 #include <sauce/memory.h>
11 #include <sauce/internal/opaque_binding.h>
12 #include <sauce/internal/resolved_binding.h>
13 #include <sauce/internal/key.h>
14 #include <sauce/internal/type_id.h>
27 template<
typename Dependency>
28 sauce::shared_ptr<ResolvedBinding<Dependency> > resolve(OpaqueBindingPtr binding) {
29 assert((namedTypeIdOf<Dependency>(binding->getName())) == binding->getKey());
30 return sauce::static_pointer_cast<ResolvedBinding<Dependency> >(binding);
49 template<
typename ImplicitBindings>
51 typedef std::map<NamedTypeId, OpaqueBindingPtr> ProvidingBindingMap;
52 typedef std::multimap<NamedTypeId, OpaqueBindingPtr> ModifyingBindingMap;
53 typedef std::multimap<TypeId, OpaqueBindingPtr> ScopeMap;
54 typedef sauce::shared_ptr<Injector> InjectorPtr;
56 ProvidingBindingMap providingBindingMap;
57 ModifyingBindingMap modifyingBindingMap;
63 providingBindingMap(),
64 modifyingBindingMap(),
70 void put(OpaqueBindingPtr binding) {
71 if (binding->isModifier()) {
72 modifyingBindingMap.insert(std::make_pair(binding->getKey(), binding));
74 providingBindingMap.insert(std::make_pair(binding->getKey(), binding));
75 TypeId scopeKey = binding->getScopeKey();
76 scopeMap.insert(std::make_pair(scopeKey, binding));
80 template<
typename Dependency>
81 sauce::shared_ptr<ResolvedBinding<Dependency> > getProvidingBinding(std::string
const name)
const {
82 sauce::shared_ptr<ResolvedBinding<Dependency> > binding;
84 ProvidingBindingMap::const_iterator
i = providingBindingMap.find(namedTypeIdOf<Dependency>(name));
85 if (i == providingBindingMap.end()) {
87 binding = implicitBindings.template getProviding<Dependency>(*
this, name);
89 binding = resolve<Dependency>(i->second);
95 template<
typename Dependency>
96 std::vector<sauce::shared_ptr<ResolvedBinding<Dependency> > > getModifierBindings(std::string
const name)
const {
97 ImplicitBindings implicitBindings;
98 std::vector<sauce::shared_ptr<ResolvedBinding<Dependency> > > bindings =
99 implicitBindings.template getModifyings<Dependency>(*
this, name);
101 NamedTypeId bindingKey = namedTypeIdOf<Dependency>(name);
102 ModifyingBindingMap::const_iterator i = modifyingBindingMap.lower_bound(bindingKey);
103 ModifyingBindingMap::const_iterator end = modifyingBindingMap.upper_bound(bindingKey);
105 for (; i != end; ++i) {
106 OpaqueBindingPtr
const & binding = i->second;
107 bindings.push_back(resolve<Dependency>(binding));
113 template<
typename Dependency>
114 void validateAcyclic(
bool validateProviding, InjectorPtr injector, TypeIds & ids, std::string
const name)
const {
115 typedef sauce::shared_ptr<ResolvedBinding<Dependency> > BindingPtr;
118 if (validateProviding) {
119 binding = getProvidingBinding<Dependency>(name);
120 binding->validateAcyclic(injector, ids);
123 typedef std::vector<BindingPtr> BindingPtrs;
124 BindingPtrs bindings = getModifierBindings<Dependency>(name);
126 for (
typename BindingPtrs::iterator i = bindings.begin(); i != bindings.end(); ++i) {
128 binding->validateAcyclic(injector, ids);
137 template<
typename Dependency>
139 typedef sauce::shared_ptr<ResolvedBinding<Dependency> > BindingPtr;
142 if (injected.get() == NULL) {
143 binding = getProvidingBinding<Dependency>(name);
144 binding->get(injected, binding, injector);
147 typedef std::vector<BindingPtr> BindingPtrs;
148 BindingPtrs bindings = getModifierBindings<Dependency>(name);
150 for (
typename BindingPtrs::iterator i = bindings.begin(); i != bindings.end(); ++i) {
152 binding->get(injected, binding, injector);
156 template<
typename Scope>
157 void eagerlyInject(InjectorPtr injector)
const {
158 TypeId scopeKey = typeIdOf<Scope>();
159 ScopeMap::const_iterator i = scopeMap.lower_bound(scopeKey);
160 ScopeMap::const_iterator end = scopeMap.upper_bound(scopeKey);
162 for (; i != end; ++i) {
163 OpaqueBindingPtr
const & binding = i->second;
164 binding->eagerlyInject(binding, injector);
171 namespace i = ::sauce::internal;
175 #endif // SAUCE_INTERNAL_BINDINGS_H_
A TypeSignature equipped with specific helper methods dealing in the hidden type. ...
Definition: type_id.h:34
A container for bindings.
Definition: bindings.h:50
void put(OpaqueBindingPtr binding)
Insert the given binding.
Definition: bindings.h:70
A complete specification of a dependency request.
Definition: key.h:15
Attempts to supply a Binding when none is found for a dependency.
Definition: implicit_bindings.h:53