1 #ifndef __STDAIR_FAC_FACBOMMANAGER_HPP
2 #define __STDAIR_FAC_FACBOMMANAGER_HPP
12 #include <boost/static_assert.hpp>
13 #include <boost/type_traits/is_same.hpp>
39 template <
typename OBJECT2,
typename OBJECT1>
51 template <
typename OBJECT2,
typename OBJECT1>
65 template <
typename OBJECT1,
typename OBJECT2>
66 static void addToList (OBJECT1&, OBJECT2&);
80 template <
typename OBJECT1,
typename OBJECT2>
94 template <
typename OBJECT1,
typename OBJECT2>
95 static void addToMap (OBJECT1&, OBJECT2&);
108 template <
typename OBJECT1,
typename OBJECT2>
123 template <
typename OBJECT1,
typename OBJECT2>
132 template <
typename PARENT,
typename CHILD>
145 template <
typename OBJECT2,
typename OBJECT1>
146 static void cloneHolder (OBJECT1&,
const OBJECT1&);
162 template <
typename OBJECT1,
typename OBJECT2>
178 template <
typename OBJECT1,
typename OBJECT2>
190 template <
typename OBJECT2,
typename OBJECT1>
212 template <
typename OBJECT2,
typename OBJECT1>
220 BOOST_STATIC_ASSERT ((boost::is_same<OBJECT1, SegmentDate>::value ==
false
221 || boost::is_same<OBJECT2, SegmentDate>::value ==
false));
226 const bool hasInsertBeenSuccessful =
227 ioObject1._holderMap.insert (
typename HolderMap_T::
228 value_type (&
typeid (OBJECT2),
229 lBomHolder_ptr)).second;
230 assert (hasInsertBeenSuccessful ==
true);
232 return *lBomHolder_ptr;
238 template <
typename OBJECT2,
typename OBJECT1>
246 BOOST_STATIC_ASSERT ((boost::is_same<OBJECT1, SegmentDate>::value ==
false
247 || boost::is_same<OBJECT2, SegmentDate>::value ==
false));
252 HolderMap_T::const_iterator itHolder =
253 ioObject1._holderMap.find (&
typeid (OBJECT2));
255 if (itHolder != ioObject1._holderMap.end()) {
259 return lBomHolder_ptr;
264 template <
typename OBJECT2,
typename OBJECT1>
271 HolderMap_T::const_iterator itHolder =
272 ioObject1._holderMap.find (&
typeid (OBJECT2));
274 if (itHolder == ioObject1._holderMap.end()) {
275 lBomHolder_ptr = &addBomHolder<OBJECT2, OBJECT1> (ioObject1);
278 lBomHolder_ptr =
static_cast<BomHolder<OBJECT2>*
> (itHolder->second);
281 assert (lBomHolder_ptr != NULL);
283 return *lBomHolder_ptr;
288 template <
typename OBJECT1,
typename OBJECT2>
290 OBJECT1& ioObject1, OBJECT2& ioObject2) {
291 ioBomHolder._bomList.push_back (&ioObject2);
298 template <
typename OBJECT1,
typename OBJECT2>
303 addToList<OBJECT1, OBJECT2> (lBomHolder, ioObject1, ioObject2);
308 template <
typename OBJECT1,
typename OBJECT2>
310 OBJECT1& ioObject1, OBJECT2& ioObject2,
313 const bool insertionSucceeded =
314 ioBomHolder.
_bomMap.insert (
typename std::map<const MapKey_T, OBJECT2*>::
315 value_type (iKey, &ioObject2)).second;
317 if (insertionSucceeded ==
false) {
319 std::ostringstream oStr;
320 oStr <<
"The given object ('" << iKey
321 <<
"') can not be added to the map of '" << ioObject1.describeKey()
322 <<
"' object. That map already contains: '";
324 unsigned int idx = 0;
325 for (
typename std::map<const MapKey_T, OBJECT2*>::const_iterator iter =
327 iter != ioBomHolder.
_bomMap.end(); ++iter, ++idx) {
328 const OBJECT2* lCurrentObject_ptr = iter->second;
329 assert (lCurrentObject_ptr != NULL);
334 oStr << lCurrentObject_ptr->describeKey();
339 throw ObjectLinkingException (oStr.str());
354 BOOST_STATIC_ASSERT ((boost::is_same<OBJECT1, SegmentDate>::value ==
false
355 || boost::is_same<OBJECT2, SegmentDate>::value ==
false));
359 addToMap<OBJECT1, OBJECT2> (lBomHolder, ioObject1, ioObject2, iKey);
365 template <
typename OBJECT1,
typename OBJECT2>
373 BOOST_STATIC_ASSERT ((boost::is_same<OBJECT1, SegmentDate>::value ==
false
374 || boost::is_same<OBJECT2, SegmentDate>::value ==
false));
376 const MapKey_T& lKey = ioObject2.describeKey();
377 addToMap (ioObject1, ioObject2, lKey);
383 template <
typename OBJECT1,
typename OBJECT2>
391 BOOST_STATIC_ASSERT ((boost::is_same<OBJECT1, SegmentDate>::value ==
false
392 || boost::is_same<OBJECT2, SegmentDate>::value ==
false));
396 addToList<OBJECT1, OBJECT2> (lBomHolder, ioObject1, ioObject2);
397 addToMap<OBJECT1, OBJECT2> (lBomHolder, ioObject1, ioObject2, iKey);
411 BOOST_STATIC_ASSERT ((boost::is_same<OBJECT1, SegmentDate>::value ==
false
412 || boost::is_same<OBJECT2, SegmentDate>::value ==
false));
414 const MapKey_T& lKey = ioObject2.describeKey();
415 addToListAndMap<OBJECT1, OBJECT2> (ioObject1, ioObject2, lKey);
423 ioChild._parent = &ioParent;
433 BomManager::getBomHolder<OBJECT2> (iOri);
437 lDestHolder._bomMap = lOriginHolder.
_bomMap;
449 inline void FacBomManager::addToList <SegmentDate,SegmentDate>
453 ioSegmentDate._marketingSegmentDateList.push_back(&ioMarketingSegmentDate);
471 #endif // __STDAIR_FAC_FACBOMMANAGER_HPP