11 #include <boost/any.hpp>
12 #include <boost/make_shared.hpp>
13 #include <boost/shared_ptr.hpp>
72 void park(T parked_object, std::function<
void()> unpark_callback) {
73 auto it = find(parked_object);
74 if (it == parking_.end() || it->refcount_ <= 0) {
76 " reference count for this object hasn't been increased."
77 " Call ParkingLot::reference() first");
79 it->update(parked_object, unpark_callback);
93 auto it = find(parked_object);
94 if (it == parking_.end()) {
95 ParkingInfo parking_info(parked_object);
96 parking_.push_back(parking_info);
117 bool unpark(T parked_object,
bool force =
false) {
118 auto it = find(parked_object);
119 if (it != parking_.end()) {
127 if (it->refcount_ <= 0) {
129 std::function<void()> cb = it->unpark_callback_;
153 auto it = find(parked_object);
154 if (it != parking_.end()) {
168 boost::any parked_object_;
169 std::function<void()> unpark_callback_;
176 ParkingInfo(
const boost::any& parked_object,
177 std::function<
void()> callback = 0)
178 : parked_object_(parked_object), unpark_callback_(callback),
186 void update(
const boost::any& parked_object,
187 std::function<
void()> callback) {
188 parked_object_ = parked_object;
189 unpark_callback_ = callback;
194 typedef std::list<ParkingInfo> ParkingInfoList;
196 typedef ParkingInfoList::iterator ParkingInfoListIterator;
199 ParkingInfoList parking_;
208 ParkingInfoListIterator find(T parked_object) {
209 for (
auto it = parking_.begin(); it != parking_.end(); ++it) {
210 if (boost::any_cast<T>(it->parked_object_) == parked_object) {
214 return (parking_.end());
239 : parking_lot_(parking_lot) {
252 parking_lot_->reference(parked_object);
268 return (parking_lot_->unpark(parked_object));
281 return (parking_lot_->drop(parked_object));
302 parking_lots_.clear();
314 if (parking_lots_.count(hook_index) == 0) {
315 parking_lots_[hook_index] = boost::make_shared<ParkingLot>();
317 return (parking_lots_[hook_index]);
323 std::map<int, ParkingLotPtr> parking_lots_;