blob: 0d1d39d309ba27375ed71eb9e4e1cae5e2e51f61 [file] [log] [blame]
Alexander Afanasyeva3887ae2014-12-29 16:11:57 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (c) 2013-2015 Regents of the University of California.
4 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
6 *
7 * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8 * terms of the GNU Lesser General Public License as published by the Free Software
9 * Foundation, either version 3 of the License, or (at your option) any later version.
10 *
11 * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14 *
15 * You should have received copies of the GNU General Public License and GNU Lesser
16 * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17 * <http://www.gnu.org/licenses/>.
18 *
19 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
20 */
21
22#ifndef NDN_TAG_HOST_HPP
23#define NDN_TAG_HOST_HPP
24
25#include "common.hpp"
26#include "tag.hpp"
27
28#include <map>
29
30namespace ndn {
31
32/** \brief Base class to store tag information (e.g., inside Interest and Data packets)
33 */
34class TagHost
35{
36public:
37 /** \brief get a tag item
38 * \tparam T type of the tag, which must be a subclass of ndn::Tag
39 * \retval nullptr if no Tag of type T is stored
40 */
41 template<typename T>
42 shared_ptr<T>
43 getTag() const;
44
45 /** \brief set a tag item
46 * \tparam T type of the tag, which must be a subclass of ndn::Tag
47 * \note Tag can be set even on a const tag host instance
48 */
49 template<typename T>
50 void
51 setTag(shared_ptr<T> tag) const;
52
53 /** \brief remove tag item
54 * \note Tag can be removed even on a const tag host instance
55 */
56 template<typename T>
57 void
58 removeTag() const;
59
60private:
61 mutable std::map<size_t, shared_ptr<Tag>> m_tags;
62};
63
64
65template<typename T>
66inline shared_ptr<T>
67TagHost::getTag() const
68{
69 static_assert(std::is_base_of<Tag, T>::value, "T must inherit from Tag");
70
71 auto it = m_tags.find(T::getTypeId());
72 if (it == m_tags.end()) {
73 return nullptr;
74 }
75 return static_pointer_cast<T>(it->second);
76}
77
78template<typename T>
79inline void
80TagHost::setTag(shared_ptr<T> tag) const
81{
82 static_assert(std::is_base_of<Tag, T>::value, "T must inherit from Tag");
83
84 if (tag == nullptr) {
85 m_tags.erase(T::getTypeId());
86 return;
87 }
88
89 m_tags[T::getTypeId()] = tag;
90}
91
92template<typename T>
93inline void
94TagHost::removeTag() const
95{
96 setTag<T>(nullptr);
97}
98
99} // namespace ndn
100
101#endif // NDN_TAG_HOST_HPP