OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
dependency.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef __BASE_DEPENDENCY_H__
6 #define __BASE_DEPENDENCY_H__
7 
8 #include <boost/intrusive/list.hpp>
9 #include <boost/iterator/iterator_facade.hpp>
10 #include "base/util.h"
11 
12 template <typename NodeType, typename ObjectType>
14 
15 template <typename NodeType, typename ObjectType>
17 public:
18  explicit DependencyRef(NodeType *self) : self_(self), ptr_(NULL) { }
19  DependencyRef(NodeType *self, ObjectType *ptr)
20  : self_(self), ptr_(ptr) {
21  if (ptr_ != NULL) {
22  ptr_->DependencyAdd(this);
23  }
24  }
25 
27  if (ptr_ != NULL) {
28  ptr_->DependencyRemove(this);
29  }
30  }
31 
32  void reset(ObjectType *ptr) {
33  if (ptr_ != NULL) {
34  ptr_->DependencyRemove(this);
35  }
36  ptr_ = ptr;
37  if (ptr_ != NULL) {
38  ptr_->DependencyAdd(this);
39  }
40  }
41 
42  void clear() {
43  if (ptr_ != NULL) {
44  ptr_->DependencyRemove(this);
45  }
46  ptr_ = NULL;
47  }
48 
49  ObjectType *get() const {
50  return ptr_;
51  }
52 
53  ObjectType *operator->() const {
54  return ptr_;
55  }
56 
57 private:
58  friend class DependencyList<NodeType, ObjectType>;
59  boost::intrusive::list_member_hook<> node_;
60  NodeType *self_;
61  ObjectType *ptr_;
63 };
64 
65 template <typename NodeType, typename ObjectType>
66 class DependencyList {
67 public:
68  typedef boost::intrusive::member_hook<
70  boost::intrusive::list_member_hook<>,
72  typedef boost::intrusive::list<
74 
75  template <typename ValueType, typename IteratorType>
76  class IteratorBase : public boost::iterator_facade<
77  IteratorBase<ValueType, IteratorType>, ValueType,
78  boost::forward_traversal_tag> {
79  public:
80  explicit IteratorBase(const IteratorType &iter) : iter_(iter) { }
81  private:
82  void increment() { ++iter_; }
83  bool equal(const IteratorBase &rhs) const {
84  return iter_ == rhs.iter_;
85  }
87  return *(iter_->self_);
88  }
90  IteratorType iter_;
91  };
92  typedef IteratorBase<NodeType, typename List::iterator> iterator;
93  typedef IteratorBase<const NodeType,
94  typename List::const_iterator> const_iterator;
97 
99  list_.push_back(*node);
100  }
101 
103  list_.erase(list_.iterator_to(*node));
104  }
105 
106  void clear() {
107  while (!list_.empty()) {
109  node->clear();
110  }
111  }
112 
113  const List &list() const { return list_; }
114 
115  iterator begin() { return iterator(list_.begin()); }
116  iterator end() { return iterator(list_.end()); }
118  return const_iterator(list_.begin());
119  }
120  const_iterator end() const {
121  return const_iterator(list_.end());
122  }
123 
124  bool empty() const { return list_.empty(); }
125 
126 private:
129 };
130 
131 #define DEPENDENCY_LIST(NodeType, ObjectType, _Member) \
132  friend class DependencyRef<NodeType, ObjectType>; \
133  void DependencyAdd(DependencyRef<NodeType, ObjectType> *node) { \
134  _Member.Add(node); \
135  } \
136  void DependencyRemove(DependencyRef<NodeType, ObjectType> *node) { \
137  _Member.Remove(node); \
138  } \
139  DependencyList<NodeType, ObjectType> _Member
140 
141 #endif
DependencyRef(NodeType *self)
Definition: dependency.h:18
iterator end()
Definition: dependency.h:116
IteratorBase(const IteratorType &iter)
Definition: dependency.h:80
void clear()
Definition: dependency.h:42
DependencyRef(NodeType *self, ObjectType *ptr)
Definition: dependency.h:19
bool empty() const
Definition: dependency.h:124
void Remove(DependencyRef< NodeType, ObjectType > *node)
Definition: dependency.h:102
const_iterator end() const
Definition: dependency.h:120
boost::intrusive::list< DependencyRef< NodeType, ObjectType >, MemberHook > List
Definition: dependency.h:73
IteratorBase< const NodeType, typename List::const_iterator > const_iterator
Definition: dependency.h:94
void Add(DependencyRef< NodeType, ObjectType > *node)
Definition: dependency.h:98
DISALLOW_COPY_AND_ASSIGN(DependencyRef)
NodeType * self_
Definition: dependency.h:60
boost::intrusive::member_hook< DependencyRef< NodeType, ObjectType >, boost::intrusive::list_member_hook<>,&DependencyRef< NodeType, ObjectType >::node_ > MemberHook
Definition: dependency.h:71
DISALLOW_COPY_AND_ASSIGN(DependencyList)
friend class boost::iterator_core_access
Definition: dependency.h:89
ValueType & dereference() const
Definition: dependency.h:86
const_iterator begin() const
Definition: dependency.h:117
ObjectType * ptr_
Definition: dependency.h:61
const List & list() const
Definition: dependency.h:113
ObjectType * operator->() const
Definition: dependency.h:53
boost::intrusive::list_member_hook node_
Definition: dependency.h:59
iterator begin()
Definition: dependency.h:115
bool equal(const IteratorBase &rhs) const
Definition: dependency.h:83
IteratorBase< NodeType, typename List::iterator > iterator
Definition: dependency.h:92
void reset(ObjectType *ptr)
Definition: dependency.h:32