31#ifndef BERTINI_GENERIC_POOL_HPP
32#define BERTINI_GENERIC_POOL_HPP
39 template<
typename ObjT>
40 struct SharedPointerPolicy
42 using PointerType = std::shared_ptr<ObjT>;
45 PointerType FromObj(ObjT d)
47 return std::make_shared<ObjT>(std::move(d));
51 PointerType DefaultConstructed()
53 return std::make_shared<ObjT>();
59 template<
typename ObjT>
60 using DefaultPointerPolicy = SharedPointerPolicy<ObjT>;
64 template<
typename ObjT,
class Po
interPolicy = DefaultPo
interPolicy<ObjT> >
73 using HeldType =
typename PointerPolicy::PointerType;
74 using PoolHolderType = std::vector< HeldType >;
77 HeldType NonPtrAdd(ObjT d)
80 held_data_.push_back(PointerPolicy::FromObj(d));
81 return held_data_.back();
85 HeldType PtrAdd(HeldType d)
87 held_data_.push_back(d);
88 return held_data_.back();
91 template<
typename ... Ts>
93 HeldType Make(Ts&& ...ts )
95 ObjT* obj =
new ObjT(ts...);
98 auto thing = std::shared_ptr<ObjT>(
new ObjT(ts...));
99 held_data_.push_back(thing);
100 return held_data_.back();
106 std::remove_if(held_data_.begin(), held_data_.end(), [](HeldType
const& h){return h.use_count()==1;});
111 PoolHolderType held_data_;
114 template<
typename ObjT,
class Policy>
typename Pool<ObjT,Policy>::PoolHolderType Pool<ObjT,Policy>::held_data_;