blob: d6d982a5e74cd38da840d87c4e5aabed80a5ae95 [file] [log] [blame]
Alexander Afanasyev7a696fb2012-03-01 17:17:22 -08001/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
2/*
Alexander Afanasyev8722d872014-07-02 13:00:29 -07003 * Copyright (c) 2012-2014 University of California, Los Angeles
Alexander Afanasyev7a696fb2012-03-01 17:17:22 -08004 *
Alexander Afanasyev8722d872014-07-02 13:00:29 -07005 * This file is part of ChronoSync, synchronization library for distributed realtime
6 * applications for NDN.
Alexander Afanasyev7a696fb2012-03-01 17:17:22 -08007 *
Alexander Afanasyev8722d872014-07-02 13:00:29 -07008 * ChronoSync is free software: you can redistribute it and/or modify it under the terms
9 * of the GNU General Public License as published by the Free Software Foundation, either
10 * version 3 of the License, or (at your option) any later version.
Alexander Afanasyev7a696fb2012-03-01 17:17:22 -080011 *
Alexander Afanasyev8722d872014-07-02 13:00:29 -070012 * ChronoSync is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
13 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
Alexander Afanasyev7a696fb2012-03-01 17:17:22 -080015 *
Alexander Afanasyev8722d872014-07-02 13:00:29 -070016 * You should have received a copy of the GNU General Public License along with
17 * ChronoSync, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
18 *
19 * @author Zhenkai Zhu <http://irl.cs.ucla.edu/~zhenkai/>
20 * @author Chaoyi Bian <bcy@pku.edu.cn>
21 * @author Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
Alexander Afanasyev7a696fb2012-03-01 17:17:22 -080022 */
23
24#ifndef SYNC_STATE_LEAF_CONTAINER
25#define SYNC_STATE_LEAF_CONTAINER
26
Alexander Afanasyevb5547e32012-03-01 21:59:38 -080027#include "sync-leaf.h"
Alexander Afanasyeva5625322012-03-06 00:03:41 -080028#include "sync-name-info.h"
Alexander Afanasyevb5547e32012-03-01 21:59:38 -080029
Alexander Afanasyev7a696fb2012-03-01 17:17:22 -080030#include <boost/multi_index_container.hpp>
31// #include <boost/multi_index/tag.hpp>
Alexander Afanasyeva5625322012-03-06 00:03:41 -080032#include <boost/multi_index/ordered_index.hpp>
Alexander Afanasyev7a696fb2012-03-01 17:17:22 -080033// #include <boost/multi_index/composite_key.hpp>
34#include <boost/multi_index/hashed_index.hpp>
35// #include <boost/multi_index/random_access_index.hpp>
36// #include <boost/multi_index/member.hpp>
37#include <boost/multi_index/mem_fun.hpp>
38
39namespace mi = boost::multi_index;
40
Alexander Afanasyev7a696fb2012-03-01 17:17:22 -080041namespace Sync {
42
Alexander Afanasyevb5547e32012-03-01 21:59:38 -080043struct NameInfoHash : public std::unary_function<NameInfo, std::size_t>
44{
45 std::size_t
Alexander Afanasyeve4e2bf72012-03-12 12:44:54 -070046 operator() (NameInfoConstPtr prefix) const
Alexander Afanasyevb5547e32012-03-01 21:59:38 -080047 {
Alexander Afanasyeve4e2bf72012-03-12 12:44:54 -070048 return prefix->getHashId ();
49 }
50};
51
52struct NameInfoEqual : public std::unary_function<NameInfo, std::size_t>
53{
54 bool
55 operator() (NameInfoConstPtr prefix1, NameInfoConstPtr prefix2) const
56 {
57 return *prefix1 == *prefix2;
58 }
59};
60
61struct NameInfoCompare : public std::unary_function<NameInfo, std::size_t>
62{
63 bool
64 operator() (NameInfoConstPtr prefix1, NameInfoConstPtr prefix2) const
65 {
66 return *prefix1 < *prefix2;
Alexander Afanasyevb5547e32012-03-01 21:59:38 -080067 }
68};
69
Yingdi Yu7c64e5c2014-04-30 14:06:37 -070070/// @cond include_hidden
Alexander Afanasyevb5547e32012-03-01 21:59:38 -080071struct hashed { };
Alexander Afanasyeva5625322012-03-06 00:03:41 -080072struct ordered { };
Alexander Afanasyevc1030192012-03-08 22:21:28 -080073/// @endcond
Alexander Afanasyevb5547e32012-03-01 21:59:38 -080074
Alexander Afanasyev7a696fb2012-03-01 17:17:22 -080075/**
76 * \ingroup sync
77 * @brief Container for SYNC leaves
78 */
79struct LeafContainer : public mi::multi_index_container<
Alexander Afanasyeva5858032012-03-09 15:55:10 -080080 LeafPtr,
81 mi::indexed_by<
82 // For fast access to elements using NameInfo
83 mi::hashed_unique<
84 mi::tag<hashed>,
Alexander Afanasyeve4e2bf72012-03-12 12:44:54 -070085 mi::const_mem_fun<Leaf, NameInfoConstPtr, &Leaf::getInfo>,
86 NameInfoHash,
87 NameInfoEqual
Alexander Afanasyeva5858032012-03-09 15:55:10 -080088 >,
Yingdi Yu7c64e5c2014-04-30 14:06:37 -070089
Alexander Afanasyeve4e2bf72012-03-12 12:44:54 -070090 mi::ordered_unique<
91 mi::tag<ordered>,
92 mi::const_mem_fun<Leaf, NameInfoConstPtr, &Leaf::getInfo>,
93 NameInfoCompare
94 >
Alexander Afanasyev7a696fb2012-03-01 17:17:22 -080095 >
Alexander Afanasyeva5858032012-03-09 15:55:10 -080096 >
Alexander Afanasyev7a696fb2012-03-01 17:17:22 -080097{
98};
99
100} // Sync
Alexander Afanasyev7a696fb2012-03-01 17:17:22 -0800101
102#endif // SYNC_STATE_LEAF_CONTAINER