All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Pages
boost-info-parser.hpp
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
23 #ifndef NDN_BOOST_INFO_PARSER_HPP
24 #define NDN_BOOST_INFO_PARSER_HPP
25 
26 #include <istream>
27 #include <string>
28 #include <vector>
29 #include <utility>
30 #include <ndn-cpp/common.hpp>
31 
32 namespace ndn {
33 
47 {
48 public:
49  BoostInfoTree(const std::string& value = "", BoostInfoTree* parent = 0)
50  : value_(value), parent_(parent), lastChild_(0)
51  {
52  }
53 
59  void
61  (const std::string& treeName,
62  const ptr_lib::shared_ptr<BoostInfoTree>& newTree);
63 
70  const BoostInfoTree&
71  createSubtree(const std::string& treeName, const std::string& value = "");
72 
78  std::vector<const BoostInfoTree*>
79  operator [] (const std::string& key) const;
80 
87  const std::string*
88  getFirstValue(const std::string& key) const
89  {
90  std::vector<const BoostInfoTree*> list = (*this)[key];
91  if (list.size() >= 1)
92  return &list[0]->value_;
93  else
94  return 0;
95  }
96 
97  const std::string&
98  getValue() const { return value_; }
99 
100  BoostInfoTree*
101  getParent() { return parent_; }
102 
103  BoostInfoTree*
104  getLastChild() { return lastChild_; }
105 
106  std::string
107  prettyPrint(int indentLevel = 1) const;
108 
109 private:
116  std::vector<ptr_lib::shared_ptr<BoostInfoTree> >*
117  find(const std::string& treeName);
118 
119  static std::vector<std::string>
120  split(const std::string &input, char separator);
121 
122  // We can't use a map for subtrees_ because we want the keys to be in order.
123  std::vector<std::pair<std::string, std::vector<ptr_lib::shared_ptr<BoostInfoTree> > > > subtrees_;
124  std::string value_;
125  BoostInfoTree* parent_;
126  BoostInfoTree* lastChild_;
127 };
128 
129 inline std::ostream&
130 operator << (std::ostream& os, const BoostInfoTree& tree)
131 {
132  os << tree.prettyPrint();
133  return os;
134 }
135 
141 {
142 public:
144  : root_(new BoostInfoTree())
145  {
146  }
147 
153  const BoostInfoTree&
154  read(const std::string& fileName);
155 
163  const BoostInfoTree&
164  read(const std::string& input, const std::string& inputName);
165 
166  // TODO: Implement readPropertyList.
167 
172  void
173  write(const std::string& fileName) const;
174 
179  const BoostInfoTree&
180  getRoot() const { return *root_; }
181 
182 private:
192  static void
193  shlex_split(const std::string& s, std::vector<std::string>& result);
194 
202  read(std::istream& stream, BoostInfoTree* ctx);
203 
208  parseLine(const std::string& line, BoostInfoTree* context);
209 
210  ptr_lib::shared_ptr<BoostInfoTree> root_;
211 };
212 
213 }
214 
215 #endif
const BoostInfoTree & createSubtree(const std::string &treeName, const std::string &value="")
Create a new BoostInfo and insert it as a sub-tree with the given name.
Definition: boost-info-parser.cpp:53
void addSubtree(const std::string &treeName, const ptr_lib::shared_ptr< BoostInfoTree > &newTree)
Insert a BoostInfoTree as a sub-tree with the given name.
Definition: boost-info-parser.cpp:37
void write(const std::string &fileName) const
Write the root tree of this BoostInfoParser as file in Boost's INFO format.
Definition: boost-info-parser.cpp:188
BoostInfoTree is provided for compatibility with the Boost INFO property list format used in ndn-cxx...
Definition: boost-info-parser.hpp:46
const BoostInfoTree & getRoot() const
Get the root tree of this parser.
Definition: boost-info-parser.hpp:180
const BoostInfoTree & read(const std::string &fileName)
Add the contents of the file to the root BoostInfoTree.
std::vector< const BoostInfoTree * > operator[](const std::string &key) const
Look up using the key and return a list of the subtrees.
Definition: boost-info-parser.cpp:61
A BoostInfoParser reads files in Boost's INFO format and constructs a BoostInfoTree.
Definition: boost-info-parser.hpp:140
const std::string * getFirstValue(const std::string &key) const
Look up using the key and return string value of the first subtree.
Definition: boost-info-parser.hpp:88