acl  3.5.3.0
diff_manager.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include <list>
4 #include <vector>
5 #include "noncopyable.hpp"
6 
7 namespace acl
8 {
9 
10 class diff_object;
11 
12 /**
13  * 求两个集合的差集的管理器
14  */
15 class diff_manager : public noncopyable
16 {
17 public:
18  diff_manager(long long range_from = -1, long long range_to = -1);
19  ~diff_manager(void);
20 
21  /**
22  * 获得内部创建的内存池对象
23  * @return {dbuf_guard&} 返回内建内存池对象,使用该内存池创建的
24  * 对象必须在 diff_manager 对象销毁前销毁,因为 diff_manager 销毁时
25  * 该内建内存池会自动销毁
26  */
27  dbuf_guard& get_dbuf(void);
28 
29  /**
30  * 比较两个集合的差集,从而获得两个集合新增的对象集合、删除的对象集合
31  * 以及变化的对象集合
32  * @param curr_objs {const std::vector<diff_object*>&} 当前对象的集合
33  * @param old_olds {const std::list<diff_object*>&} 旧元素集合,内部
34  * 用该集合生成哈希表,使当前集合与该旧集合进行差异化比较
35  */
36  void diff_changes(const std::vector<diff_object*>& curr_objs,
37  const std::vector<diff_object*>& old_olds);
38 
39  /**
40  * 获得新增的对象集合
41  * @return {std::vector<diff_object*>&}
42  */
43  const std::vector<diff_object*>& get_new(void) const
44  {
45  return objs_new_;
46  }
47 
48  /**
49  * 当 diff_changes 进行差异化比较成功后,本函数用于返回相对于旧集合,
50  * 在当前集合中不存在的(即被删除的)元素集合
51  * @return {std::vector<diff_object*>&}
52  */
53  const std::vector<diff_object*>& get_deleted(void) const
54  {
55  return objs_del_;
56  }
57 
58  /**
59  * 当 diff_changes 进行差异化比较成功后,本函数用于返回相对于旧集合,
60  * 在当前集合中对象值发生变化的变化集合对象
61  * @return {std::vector<std::pair<diff_object*, diff_object*> >&}
62  * 返回产生变化的对象的集合,其中 pair 中的 first 为新对象,second
63  * 为旧对象
64  * @sample
65  * const std::vector<std::pair<diff_object*, diff_object*> >&
66  * results = manager.get_updated();
67  * std::vector<std::pair<diff_object*, diff_object*> >::const_iterator
68  * cit = results.begin();
69  * for (; cit != results.end(); ++cit)
70  * printf(">> key: %s, curr value:%s, old value: %s\r\n",
71  * (*cit).first->get_key(),
72  * (*cit).first->get_val(),
73  * (*cit).second->get_val());
74  */
75  const std::vector<std::pair<diff_object*, diff_object*> >&
76  get_updated(void) const
77  {
78  return objs_upd_;
79  }
80 
81  /**
82  * 当 diff_manger 进行差异华比较成功后,本函数用于返回相同对象的集合
83  * @return {std::vector<diff_object*>&}
84  */
85  const std::vector<diff_object*>& get_same(void) const
86  {
87  return objs_equ_;
88  }
89 
90  /**
91  * 获得新增的不在指定区间范围内的对象集合
92  * @return {const std::vector<diff_object*>&}
93  */
94  const std::vector<diff_object*>& get_extra_added(void) const
95  {
96  return objs_new_extra_;
97  }
98 
99  /**
100  * 获得删除的不在指定区间范围内的对象集合
101  * @return {const std::vector<diff_object*>&}
102  */
103  const std::vector<diff_object*>& get_extra_deleted(void) const
104  {
105  return objs_del_extra_;
106  }
107 
108  /**
109  * 获得修改的不在指定区间范围内的对象集合
110  * @return {const std::vector<diff_object*>&}
111  */
112  const std::vector<std::pair<diff_object*, diff_object*> >&
113  get_extra_updated(void) const
114  {
115  return objs_upd_extra_;
116  }
117 
118  /**
119  * 当重复使用本 diff_manager 进行差异化比较时,需要调用本方法来清空
120  * 上一次比较过程中产生的临时内存及对象
121  */
122  void reset(void);
123 
124 private:
125  dbuf_guard dbuf_;
126  long long range_from_;
127  long long range_to_;
128 
129  // 相同的对象集合
130  std::vector<diff_object*> objs_equ_;
131 
132  // 变化的对象集合
133 
134  // 新增的对象集合
135  std::vector<diff_object*> objs_new_;
136  // 删除的对象集合
137  std::vector<diff_object*> objs_del_;
138  // 修改的对象集合
139  std::vector<std::pair<diff_object*, diff_object*> > objs_upd_;
140 
141  // 多余的对象集合
142 
143  // 新增的多余对象集合
144  std::vector<diff_object*> objs_new_extra_;
145  // 删除的多余对象集合
146  std::vector<diff_object*> objs_del_extra_;
147  // 修改的多余对象集合
148  std::vector<std::pair<diff_object*, diff_object*> > objs_upd_extra_;
149 };
150 
151 } // namespace acl
const std::vector< diff_object * > & get_new(void) const
const std::vector< diff_object * > & get_extra_added(void) const
const std::vector< diff_object * > & get_deleted(void) const
dbuf_guard & get_dbuf(void)
const std::vector< diff_object * > & get_same(void) const
diff_manager(long long range_from=-1, long long range_to=-1)
void diff_changes(const std::vector< diff_object * > &curr_objs, const std::vector< diff_object * > &old_olds)
const std::vector< std::pair< diff_object *, diff_object * > > & get_updated(void) const
void reset(void)
const std::vector< std::pair< diff_object *, diff_object * > > & get_extra_updated(void) const
const std::vector< diff_object * > & get_extra_deleted(void) const