Choreonoid  1.1
YamlNodes.h
[詳解]
1 
5 #ifndef CNOID_UTIL_YAML_NODES_H_INCLUDED
6 #define CNOID_UTIL_YAML_NODES_H_INCLUDED
7 
8 #include "Utf8.h"
9 #include <map>
10 #include <vector>
11 #include <cstring>
12 #include <iosfwd>
13 #include <boost/intrusive_ptr.hpp>
14 #include "exportdecl.h"
15 
16 namespace cnoid {
17  class YamlNode;
18 }
19 
20 namespace cnoid {
23 }
24 
25 
26 namespace cnoid {
27 
30 
31  class YamlScalar;
32  class YamlMapping;
33  class YamlSequence;
34  class YamlReaderImpl;
35  class YamlWriter;
36 
38  {
39  public:
40 
41  static void initialize();
42 
43  inline bool isValid() const { return type_ != YAML_NONE; }
44 
45  inline YamlNodeType type() const { return type_; }
46 
47  int toInt() const;
48  double toDouble() const;
49  bool toBool() const;
50 
51  inline bool isString() const { return type_ == YAML_SCALAR; }
52 
53 #ifdef _WIN32
54  const std::string toString() const;
55  const std::string toUtf8String() const;
56 
57  inline operator std::string () const {
58  return toString();
59  }
60 #else
61  const std::string& toString() const;
62  const std::string& toUtf8String() const;
63 
64  inline operator const std::string& () const {
65  return toString();
66  }
67 #endif
68 
69  inline bool isMapping() const { return type_ == YAML_MAPPING; }
70  const YamlMapping* toMapping() const;
71  YamlMapping* toMapping();
72 
73  inline bool isSequence() const { return type_ == YAML_SEQUENCE; }
74  const YamlSequence* toSequence() const;
75  YamlSequence* toSequence();
76 
77  //bool read(std::string &out_value) const;
78  //bool read(bool &out_value) const;
79  bool read(int &out_value) const;
80  //bool read(double &out_value) const;
81 
82  inline bool hasLineInfo() const { return (line_ >= 0); }
83  inline int line() const { return line_ + 1; }
84  inline int column() const { return column_ + 1; }
85 
87  public:
88  virtual ~Exception();
89  int line() const { return line_; }
90  int column() const { return column_; }
91  const std::string& message() const { return message_; }
92  void setPosition(int line, int column) {
93  line_ = line;
94  column_ = column;
95  }
96  void setMessage(const std::string& m){
97  message_ = m;
98  }
99  private:
100  int line_;
101  int column_;
102  std::string message_;
103  };
104 
106  public:
107  const std::string& key() { return key_; }
108  void setKey(const std::string& key) { key_ = key; }
109  private:
110  std::string key_;
111  };
112 
113  class NotScalarException : public Exception {
114  };
115 
117  };
118 
120  };
121 
123  };
124 
125  class SyntaxException : public Exception {
126  };
127 
129  };
130 
131  private:
132 
133  int refCounter;
134 
135  protected:
136 
137  YamlNode() : refCounter(0) { }
138  YamlNode(YamlNodeType type) : refCounter(0), type_(type), line_(-1), column_(-1) { }
139 
140  virtual ~YamlNode() { }
141 
142  void throwNotScalrException() const;
143  void throwNotMappingException() const;
144  void throwNotSequenceException() const;
145 
147 
148  private:
149 
150  // disabled copy operations
151  YamlNode(const YamlNode&);
152  YamlNode& operator=(const YamlNode&);
153 
154  int line_;
155  int column_;
156  int indexInMapping; // used for YamlWriter
157 
158  friend class YamlReaderImpl;
159  friend class YamlWriter;
160  friend class YamlScalar;
161  friend class YamlMapping;
162  friend class YamlSequence;
163 
164  friend void intrusive_ptr_add_ref(YamlNode* obj);
165  friend void intrusive_ptr_release(YamlNode* obj);
166  };
167 
168  typedef boost::intrusive_ptr<YamlNode> YamlNodePtr;
169 
170 
172  {
173  private:
174  YamlScalar(const char* text, size_t length);
175  YamlScalar(const char* text, size_t length, YamlStringStyle stringStyle);
176  YamlScalar(const std::string& value, YamlStringStyle stringStyle);
177 
178  std::string stringValue;
179  YamlStringStyle stringStyle;
180 
181  friend class YamlReaderImpl;
182  friend class YamlWriter;
183  friend class YamlNode;
184  friend class YamlMapping;
185  friend class YamlSequence;
186  };
187 
188 
190  {
191  public:
192  virtual ~YamlCollection();
193 
194  inline void setFlowStyle(bool isFlowStyle = true) { isFlowStyle_ = isFlowStyle; }
195  inline bool isFlowStyle() const { return isFlowStyle_; }
196 
197  void setDoubleFormat(const char* format);
198  inline const char* doubleFormat() { return doubleFormat_; }
199 
200  protected:
201  YamlCollection();
202  const char* doubleFormat_;
203 
204  private:
206  YamlCollection& operator=(const YamlCollection&);
207 
208  bool isFlowStyle_;
209  };
210 
211 
213  {
214  typedef std::map<std::string, YamlNodePtr> Container;
215 
216  public:
217 
218  typedef Container::iterator iterator;
219  typedef Container::const_iterator const_iterator;
220 
221  YamlMapping();
222  YamlMapping(int line, int column);
223  virtual ~YamlMapping();
224 
225  inline bool empty() const { return values.empty(); }
226  inline size_t size() const { return values.size(); }
227  void clear();
228 
229  void setKeyQuoteStyle(YamlStringStyle style);
230 
231  YamlNode* find(const std::string& key) const;
232  YamlMapping* findMapping(const std::string& key) const;
233  YamlSequence* findSequence(const std::string& key) const;
234 
235  YamlNode& get(const std::string& key) const;
236 
237  inline YamlNode& operator[](const std::string& key) const {
238  return get(key);
239  }
240 
241  void insert(const std::string& key, YamlNodePtr node);
242 
243  inline YamlMapping* openMapping(const std::string& key) {
244  return openMapping(key, false);
245  }
246 
247  inline YamlMapping* openFlowStyleMapping(const std::string& key) {
248  return openFlowStyleMapping(key, false);
249  }
250 
251  inline YamlMapping* createMapping(const std::string& key) {
252  return openMapping(key, true);
253  }
254 
255  inline YamlMapping* createFlowStyleMapping(const std::string& key) {
256  return openFlowStyleMapping(key, true);
257  }
258 
259  inline YamlSequence* openSequence(const std::string& key) {
260  return openSequence(key, false);
261  }
262 
263  inline YamlSequence* openFlowStyleSequence(const std::string& key){
264  return openFlowStyleSequence(key, false);
265  }
266 
267  inline YamlSequence* createSequence(const std::string& key){
268  return openSequence(key, true);
269  }
270 
271  inline YamlSequence* createFlowStyleSequence(const std::string& key){
272  return openFlowStyleSequence(key, true);
273  }
274 
275  bool read(const std::string &key, std::string &out_value) const;
276  bool readUtf8(const std::string &key, std::string &out_value) const;
277  bool read(const std::string &key, bool &out_value) const;
278  bool read(const std::string &key, int &out_value) const;
279  bool read(const std::string &key, double &out_value) const;
280 
281  template <class T>
282  inline T read(const std::string& key) const {
283  T value;
284  if(read(key, value)){
285  return value;
286  } else {
287  throwKeyNotFoundException(key);
288  }
289  }
290 
291  template <class T>
292  inline T get(const std::string& key, const T& defaultValue) const {
293  T value;
294  if(read(key, value)){
295  return value;
296  } else {
297  return defaultValue;
298  }
299  }
300 
301  inline std::string get(const std::string& key, const char* defaultValue) const {
302  std::string value;
303  if(read(key, value)){
304  return value;
305  } else {
306  return defaultValue;
307  }
308  }
309 
310  void writeUtf8(const std::string &key, const std::string& value, YamlStringStyle stringStyle = YAML_PLAIN_STRING);
311 
312  void write(const std::string &key, const std::string& value, YamlStringStyle stringStyle = YAML_PLAIN_STRING) {
313  writeUtf8(key, toUtf8(value), stringStyle);
314  }
315 
316  void writeUtf8(const std::string &key, const char* value, YamlStringStyle stringStyle = YAML_PLAIN_STRING){
317  writeUtf8(key, std::string(value), stringStyle);
318  }
319 
320  void write(const std::string &key, const char* value, YamlStringStyle stringStyle = YAML_PLAIN_STRING){
321  write(key, std::string(value), stringStyle);
322  }
323 
324  void write(const std::string &key, bool value);
325  void write(const std::string &key, int value);
326  void write(const std::string &key, double value);
327  void writePath(const std::string &key, const std::string& value);
328 
329  typedef enum { READ_MODE, WRITE_MODE } AssignMode;
330 
331  inline void setAssignMode(AssignMode mode) { this->mode = mode; }
332 
333  template <class T>
334  void assign(const std::string& key, T& io_value, const T& defaultValue){
335  switch(mode){
336  case READ_MODE:
337  if(!read(key, io_value)){
338  io_value = defaultValue;
339  }
340  break;
341  case WRITE_MODE:
342  write(key, io_value);
343  break;
344  }
345  }
346 
347  inline iterator begin() { return values.begin(); }
348  inline iterator end() { return values.end(); }
349  inline const_iterator begin() const { return values.begin(); }
350  inline const_iterator end() const { return values.end(); }
351 
352  void throwKeyNotFoundException(const std::string& key) const;
353 
354  private:
355 
356  YamlMapping(const YamlMapping&);
357  YamlMapping& operator=(const YamlMapping&);
358 
359  YamlMapping* openMapping(const std::string& key, bool doOverwrite);
360  YamlMapping* openFlowStyleMapping(const std::string& key, bool doOverwrite);
361  YamlSequence* openSequence(const std::string& key, bool doOverwrite);
362  YamlSequence* openFlowStyleSequence(const std::string& key, bool doOverwrite);
363 
364  inline void insertSub(const std::string& key, YamlNode* node);
365 
366  void writeSub(const std::string &key, const char* text, size_t length, YamlStringStyle stringStyle);
367 
368  static bool compareIters(const YamlMapping::const_iterator& it1, const YamlMapping::const_iterator& it2);
369 
370  Container values;
371  AssignMode mode;
372  int indexCounter;
373  YamlStringStyle keyQuoteStyle;
374 
375  friend class YamlSequence;
376  friend class YamlReaderImpl;
377  friend class YamlWriter;
378  };
379 
380  typedef boost::intrusive_ptr<YamlMapping> YamlMappingPtr;
381 
382 
387  {
388  typedef std::vector<YamlNodePtr> Container;
389 
390  public:
391 
392  YamlSequence();
393  YamlSequence(int size);
394  ~YamlSequence();
395 
396  typedef Container::iterator iterator;
397  typedef Container::const_iterator const_iterator;
398 
399  inline bool empty() const { return values.empty(); }
400  inline int size() const { return values.size(); }
401  void clear();
402  void reserve(int size);
403 
404  inline YamlNode& front() const {
405  return *values.front();
406  }
407 
408  inline YamlNode& back() const {
409  return *values.back();
410  }
411 
412  YamlNode* at(int i) const;
413 
414  inline YamlNode& get(int i) const {
415  return *values[i];
416  }
417 
418  void write(int i, int value);
419  void write(int i, const std::string& value, YamlStringStyle stringStyle = YAML_PLAIN_STRING);
420 
421  bool read(int i, bool &out_value) const;
422  bool read(int i, int &out_value) const;
423  bool read(int i, double &out_value) const;
424 
425  inline YamlNode& operator[](int i) const {
426  return *values[i];
427  }
428 
429  YamlMapping* newMapping();
430 
431  inline void append(YamlNodePtr node) {
432  values.push_back(node);
433  }
434 
435  void append(int value);
436 
442  inline void append(int value, int maxColumns, int numValues = 0) {
443  insertLF(maxColumns, numValues);
444  append(value);
445  }
446 
447  void append(size_t value);
448 
454  inline void append(size_t value, int maxColumns, int numValues = 0){
455  insertLF(maxColumns, numValues);
456  append(value);
457  }
458 
459  void append(double value);
460 
466  inline void append(double value, int maxColumns, int numValues = 0) {
467  insertLF(maxColumns, numValues);
468  append(value);
469  }
470 
471  void append(const std::string& value, YamlStringStyle stringStyle = YAML_PLAIN_STRING);
472 
478  inline void append(const std::string& value, int maxColumns, int numValues = 0, YamlStringStyle stringStyle = YAML_PLAIN_STRING){
479  insertLF(maxColumns, numValues);
480  append(value, stringStyle);
481  }
482 
483  void appendLF();
484 
485  inline iterator begin() { return values.begin(); }
486  inline iterator end() { return values.end(); }
487  inline const_iterator begin() const { return values.begin(); }
488  inline const_iterator end() const { return values.end(); };
489 
490  private:
491 
492  YamlSequence(int line, int column);
493  YamlSequence(int line, int column, int reservedSize);
494 
495  YamlSequence(const YamlSequence&);
496  YamlSequence& operator=(const YamlSequence&);
497 
498  void insertLF(int maxColumns, int numValues);
499 
500  Container values;
501 
502  friend class YamlMapping;
503  friend class YamlReaderImpl;
504  friend class YamlWriter;
505  };
506 
507  typedef boost::intrusive_ptr<YamlSequence> YamlSequencePtr;
508 }
509 
510 
511 namespace cnoid
512 {
514  obj->refCounter++;
515  }
516 
518  obj->refCounter--;
519  if(obj->refCounter == 0){
520  delete obj;
521  }
522  }
523 };
524 
525 
526 #endif
const char * doubleFormat()
Definition: YamlNodes.h:198
Definition: YamlWriter.h:18
Definition: YamlNodes.h:86
Definition: YamlNodes.h:189
int column() const
Definition: YamlNodes.h:84
int line() const
Definition: YamlNodes.h:89
Definition: YamlNodes.h:119
Definition: YamlNodes.h:29
Definition: YamlNodes.h:28
bool isFlowStyle() const
Definition: YamlNodes.h:195
bool isValid() const
Definition: YamlNodes.h:43
Definition: YamlNodes.h:171
bool read(const YamlMapping &mapping, const std::string &key, Eigen::MatrixBase< Derived > &x)
Definition: EigenYaml.h:14
YamlMapping * createFlowStyleMapping(const std::string &key)
Definition: YamlNodes.h:255
YamlNodeType type() const
Definition: YamlNodes.h:45
Container::const_iterator const_iterator
Definition: YamlNodes.h:397
YamlNode & operator[](int i) const
Definition: YamlNodes.h:425
void intrusive_ptr_release(cnoid::Referenced *obj)
Definition: Referenced.h:46
YamlMapping * createMapping(const std::string &key)
Definition: YamlNodes.h:251
boost::intrusive_ptr< YamlNode > YamlNodePtr
Definition: YamlNodes.h:168
Definition: YamlNodes.h:29
const_iterator end() const
Definition: YamlNodes.h:488
void append(YamlNodePtr node)
Definition: YamlNodes.h:431
Container::iterator iterator
Definition: YamlNodes.h:218
YamlSequence * createSequence(const std::string &key)
Definition: YamlNodes.h:267
void append(double value, int maxColumns, int numValues=0)
Definition: YamlNodes.h:466
const std::string & message() const
Definition: YamlNodes.h:91
Definition: YamlNodes.h:28
iterator end()
Definition: YamlNodes.h:486
Definition: YamlNodes.h:386
T read(const std::string &key) const
Definition: YamlNodes.h:282
Definition: YamlNodes.h:29
YamlNode(YamlNodeType type)
Definition: YamlNodes.h:138
const char * doubleFormat_
Definition: YamlNodes.h:202
Definition: YamlNodes.h:28
YamlNodeType
Definition: YamlNodes.h:28
bool isMapping() const
Definition: YamlNodes.h:69
void setAssignMode(AssignMode mode)
Definition: YamlNodes.h:331
const_iterator end() const
Definition: YamlNodes.h:350
void assign(const std::string &key, T &io_value, const T &defaultValue)
Definition: YamlNodes.h:334
YamlSequence & write(YamlMapping &mapping, const std::string &key, const Eigen::MatrixBase< Derived > &x)
Definition: EigenYaml.h:46
YamlMapping * openMapping(const std::string &key)
Definition: YamlNodes.h:243
Definition: YamlNodes.h:29
Definition: YamlNodes.h:28
virtual ~YamlNode()
Definition: YamlNodes.h:140
void append(int value, int maxColumns, int numValues=0)
Definition: YamlNodes.h:442
void append(const std::string &value, int maxColumns, int numValues=0, YamlStringStyle stringStyle=YAML_PLAIN_STRING)
Definition: YamlNodes.h:478
boost::intrusive_ptr< YamlSequence > YamlSequencePtr
Definition: YamlNodes.h:507
bool isString() const
Definition: YamlNodes.h:51
int line() const
Definition: YamlNodes.h:83
int column() const
Definition: YamlNodes.h:90
void intrusive_ptr_add_ref(cnoid::Referenced *obj)
Definition: Referenced.h:42
const_iterator begin() const
Definition: YamlNodes.h:487
bool isSequence() const
Definition: YamlNodes.h:73
void setKey(const std::string &key)
Definition: YamlNodes.h:108
void setMessage(const std::string &m)
Definition: YamlNodes.h:96
YamlNode & operator[](const std::string &key) const
Definition: YamlNodes.h:237
int size() const
Definition: YamlNodes.h:400
iterator end()
Definition: YamlNodes.h:348
void setPosition(int line, int column)
Definition: YamlNodes.h:92
Definition: YamlNodes.h:113
Definition: YamlNodes.h:28
YamlSequence * createFlowStyleSequence(const std::string &key)
Definition: YamlNodes.h:271
iterator begin()
Definition: YamlNodes.h:347
const std::string & toUtf8(const std::string &text)
Definition: Utf8.h:19
YamlNode & front() const
Definition: YamlNodes.h:404
iterator begin()
Definition: YamlNodes.h:485
YamlSequence * openSequence(const std::string &key)
Definition: YamlNodes.h:259
bool empty() const
Definition: YamlNodes.h:399
const std::string & key()
Definition: YamlNodes.h:107
AssignMode
Definition: YamlNodes.h:329
Definition: YamlNodes.h:37
const_iterator begin() const
Definition: YamlNodes.h:349
YamlNode & back() const
Definition: YamlNodes.h:408
void write(const std::string &key, const std::string &value, YamlStringStyle stringStyle=YAML_PLAIN_STRING)
Definition: YamlNodes.h:312
void writeUtf8(const std::string &key, const char *value, YamlStringStyle stringStyle=YAML_PLAIN_STRING)
Definition: YamlNodes.h:316
Definition: YamlNodes.h:212
void append(size_t value, int maxColumns, int numValues=0)
Definition: YamlNodes.h:454
bool empty() const
Definition: YamlNodes.h:225
YamlNodeType type_
Definition: YamlNodes.h:146
boost::intrusive_ptr< YamlMapping > YamlMappingPtr
Definition: YamlNodes.h:380
Container::const_iterator const_iterator
Definition: YamlNodes.h:219
bool hasLineInfo() const
Definition: YamlNodes.h:82
#define CNOID_EXPORT
Definition: Util/exportdecl.h:13
YamlSequence * openFlowStyleSequence(const std::string &key)
Definition: YamlNodes.h:263
YamlMapping * openFlowStyleMapping(const std::string &key)
Definition: YamlNodes.h:247
Definition: YamlNodes.h:125
size_t size() const
Definition: YamlNodes.h:226
Definition: YamlNodes.h:29
Container::iterator iterator
Definition: YamlNodes.h:396
YamlStringStyle
Definition: YamlNodes.h:29
Definition: YamlNodes.h:105
void write(const std::string &key, const char *value, YamlStringStyle stringStyle=YAML_PLAIN_STRING)
Definition: YamlNodes.h:320
bool initialize()
Definition: YamlNodes.h:122
YamlNode()
Definition: YamlNodes.h:137
void setFlowStyle(bool isFlowStyle=true)
Definition: YamlNodes.h:194