libyang  1.0.184
YANG data modeling language library
Tree_Data.hpp
Go to the documentation of this file.
1 
15 #ifndef LIBYANG_CPP_TREE_DATA_H
16 #define LIBYANG_CPP_TREE_DATA_H
17 
18 #include <iostream>
19 #include <memory>
20 #include <exception>
21 #include <vector>
22 
23 #include "Internal.hpp"
24 #include "Tree_Schema.hpp"
25 
26 extern "C" {
27 #include "libyang.h"
28 #include "tree_data.h"
29 }
30 
31 namespace libyang {
32 
40 struct Decimal64
41 {
42  int64_t value;
43  uint8_t digits;
44 };
45 
50 class Value
51 {
52 public:
54  Value(lyd_val value, LY_DATA_TYPE* value_type, uint8_t value_flags, struct lys_type *type, S_Deleter deleter);
55  ~Value();
57  const char *binary() {return LY_TYPE_BINARY == value_type ? value.binary : throw "wrong type";};
59  std::vector<S_Type_Bit> bit();
61  int8_t bln() {return LY_TYPE_BOOL == value_type ? value.bln : throw "wrong type";};
63  Decimal64 dec64() {return LY_TYPE_DEC64 == value_type ? Decimal64{ value.dec64, type->info.dec64.dig } : throw "wrong type";};
65  S_Type_Enum enm() {return LY_TYPE_ENUM == value_type ? std::make_shared<Type_Enum>(value.enm, deleter) : throw "wrong type";};
67  S_Ident ident() {return LY_TYPE_IDENT == value_type ? std::make_shared<Ident>(value.ident, deleter) : throw "wrong type";};
69  S_Data_Node instance();
71  int8_t int8() {return LY_TYPE_INT8 == value_type ? value.int8 : throw "wrong type";};
73  int16_t int16() {return LY_TYPE_INT16 == value_type ? value.int16 : throw "wrong type";};
75  int32_t int32() {return LY_TYPE_INT32 == value_type ? value.int32 : throw "wrong type";};
77  int64_t int64() {return LY_TYPE_INT64 == value_type ? value.int64 : throw "wrong type";};
79  S_Data_Node leafref();
81  const char *string() {return LY_TYPE_STRING == value_type ? value.string : throw "wrong type";};
83  uint8_t uint8() {return LY_TYPE_UINT8 == value_type ? value.uint8 : throw "wrong type";};
85  uint16_t uint16() {return LY_TYPE_UINT16 == value_type ? value.uint16 : throw "wrong type";};
87  uint32_t uint32() {return LY_TYPE_UINT32 == value_type ? value.uint32 : throw "wrong type";};
89  uint64_t uint64() {return LY_TYPE_UINT64 == value_type ? value.uint64 : throw "wrong type";};
90 
91 private:
92  lyd_val value;
93  LY_DATA_TYPE value_type;
94  uint8_t value_flags;
95  struct lys_type *type;
96  S_Deleter deleter;
97 };
98 
104 {
105 public:
107  Data_Node(struct lyd_node *node, S_Deleter deleter = nullptr);
109  Data_Node(S_Data_Node parent, S_Module module, const char *name);
111  Data_Node(S_Data_Node parent, S_Module module, const char *name, const char *val_str);
113  Data_Node(S_Data_Node parent, S_Module module, const char *name, const char *value, LYD_ANYDATA_VALUETYPE value_type);
115  Data_Node(S_Data_Node parent, S_Module module, const char *name, S_Data_Node value);
117  Data_Node(S_Data_Node parent, S_Module module, const char *name, S_Xml_Elem value);
119  Data_Node(S_Context context, const char *path, const char *value, LYD_ANYDATA_VALUETYPE value_type, int options);
121  Data_Node(S_Context context, const char *path, S_Data_Node value, int options);
123  Data_Node(S_Context context, const char *path, S_Xml_Elem value, int options);
124  //TODO
125  //struct lyd_node *lyd_new_output(struct lyd_node *parent, const struct lys_module *module, const char *name);
126  //struct lyd_node *lyd_new_output_leaf(struct lyd_node *parent, const struct lys_module *module, const char *name,
127  // const char *val_str);
128  //struct lyd_node *lyd_new_output_leaf(struct lyd_node *parent, const struct lys_module *module, const char *name,
129  // void *value, LYD_ANYDATA_VALUETYPE value_type);
130  virtual ~Data_Node();
132  S_Schema_Node schema() LY_NEW(node, schema, Schema_Node);
134  uint8_t validity() {return node->validity;};
136  uint8_t dflt() {return node->dflt;};
138  uint8_t when_status() {return node->when_status;};
140  S_Attr attr();
142  S_Data_Node next() LY_NEW(node, next, Data_Node);
144  S_Data_Node prev() LY_NEW(node, prev, Data_Node);
146  S_Data_Node parent() LY_NEW(node, parent, Data_Node);
148  virtual S_Data_Node child() LY_NEW(node, child, Data_Node);
149 
150  /* functions */
152  std::string path();
154  S_Data_Node dup(int recursive);
156  S_Data_Node dup_withsiblings(int recursive);
158  S_Data_Node dup_to_ctx(int recursive, S_Context context);
160  int merge(S_Data_Node source, int options);
162  int merge_to_ctx(S_Data_Node source, int options, S_Context context);
164  int insert(S_Data_Node new_node);
166  int insert_sibling(S_Data_Node new_node);
168  int insert_before(S_Data_Node new_node);
170  int insert_after(S_Data_Node new_node);
172  int schema_sort(int recursive);
174  S_Set find_path(const char *expr);
176  S_Set find_instance(S_Schema_Node schema);
178  S_Data_Node first_sibling();
180  int validate(int options, S_Context var_arg);
182  int validate(int options, S_Data_Node var_arg);
184  int validate_value(const char *value);
186  S_Difflist diff(S_Data_Node second, int options);
188  S_Data_Node new_path(S_Context ctx, const char *path, const char *value, LYD_ANYDATA_VALUETYPE value_type, int options);
190  S_Data_Node new_path(S_Context ctx, const char *path, S_Data_Node value, int options);
192  S_Data_Node new_path(S_Context ctx, const char *path, S_Xml_Elem value, int options);
194  unsigned int list_pos();
196  int unlink();
198  S_Attr insert_attr(S_Module module, const char *name, const char *value);
200  S_Module node_module();
202  std::string print_mem(LYD_FORMAT format, int options);
203 
204  /* emulate TREE macro's */
206  std::vector<S_Data_Node> tree_for();
208  std::vector<S_Data_Node> tree_dfs();
209 
211  struct lyd_node *swig_node() {return node;};
213  S_Deleter swig_deleter() {return deleter;};
214 
215  friend Set;
218 
220  struct lyd_node *C_lyd_node() {return node;};
221 
222 private:
223  struct lyd_node *node;
224  S_Deleter deleter;
225 };
226 
227 S_Data_Node create_new_Data_Node(struct lyd_node *node);
228 
234 {
235 public:
237  Data_Node_Leaf_List(S_Data_Node derived);
239  Data_Node_Leaf_List(struct lyd_node *node, S_Deleter deleter = nullptr);
242  const char *value_str() {return ((struct lyd_node_leaf_list *) node)->value_str;};
244  S_Value value();
246  LY_DATA_TYPE value_type() {return ((struct lyd_node_leaf_list *) node)->value_type;};
248  S_Data_Node child() {return nullptr;};
249 
250  /* functions */
252  int change_leaf(const char *val_str);
254  int wd_default();
256  S_Type leaf_type();
257 
258 private:
259  struct lyd_node *node;
260  S_Deleter deleter;
261 };
262 
268 {
269 public:
271  Data_Node_Anydata(S_Data_Node derived);
273  Data_Node_Anydata(struct lyd_node *node, S_Deleter deleter = nullptr);
276  LYD_ANYDATA_VALUETYPE value_type() {return ((struct lyd_node_anydata *) node)->value_type;};
278  lyd_anydata_value value() {return ((struct lyd_node_anydata *) node)->value;};
280  S_Data_Node child() {return nullptr;};
281 
282 private:
283  struct lyd_node *node;
284  S_Deleter deleter;
285 };
286 
291 class Attr
292 {
293 public:
295  Attr(struct lyd_attr *attr, S_Deleter deleter = nullptr);
296  ~Attr();
298  S_Data_Node parent() LY_NEW(attr, parent, Data_Node);
300  S_Attr next();
301  //struct lys_ext_instance_complex *annotation
303  const char *name() {return attr->name;};
305  const char *value_str() {return attr->value_str;};
307  S_Value value();
309  LY_DATA_TYPE value_type() {return attr->value_type;};
310 private:
311  struct lyd_attr *attr;
312  S_Deleter deleter;
313 };
314 
319 class Difflist
320 {
321 public:
323  Difflist(struct lyd_difflist *diff, S_Deleter deleter);
324  ~Difflist();
326  LYD_DIFFTYPE *type() {return diff->type;};
328  std::vector<S_Data_Node> first();
330  std::vector<S_Data_Node> second();
331 
332 private:
333  struct lyd_difflist *diff;
334  S_Deleter deleter;
335 };
336 
339 }
340 
341 #endif
libyang::Data_Node::first_sibling
S_Data_Node first_sibling()
Definition: Tree_Data.cpp:377
libyang::Data_Node_Anydata::value
lyd_anydata_value value()
Definition: Tree_Data.hpp:278
LY_TYPE_BINARY
@ LY_TYPE_BINARY
Definition: tree_schema.h:786
libyang::Data_Node::schema_sort
int schema_sort(int recursive)
Definition: Tree_Data.cpp:349
libyang::Value::Value
Value(lyd_val value, LY_DATA_TYPE *value_type, uint8_t value_flags, struct lys_type *type, S_Deleter deleter)
Definition: Tree_Data.cpp:33
libyang::Value
class for wrapping lyd_val.
Definition: Tree_Data.hpp:51
libyang::Attr
class for wrapping lyd_attr.
Definition: Tree_Data.hpp:292
libyang::Data_Node::Set
friend Set
Definition: Tree_Data.hpp:213
libyang::Data_Node::insert
int insert(S_Data_Node new_node)
Definition: Tree_Data.cpp:279
libyang::Data_Node::C_lyd_node
struct lyd_node * C_lyd_node()
Definition: Tree_Data.hpp:220
libyang::Data_Node::Data_Node_Anydata
friend Data_Node_Anydata
Definition: Tree_Data.hpp:216
libyang::Data_Node::~Data_Node
virtual ~Data_Node()
Definition: Tree_Data.cpp:204
libyang::Data_Node_Leaf_List
class for wrapping lyd_node_leaf_list.
Definition: Tree_Data.hpp:234
lys_type
YANG type structure providing information from the schema.
Definition: tree_schema.h:973
libyang::Attr::~Attr
~Attr()
Definition: Tree_Data.cpp:600
libyang::Data_Node::list_pos
unsigned int list_pos()
Definition: Tree_Data.cpp:464
lyd_value_u::int32
int32_t int32
Definition: tree_data.h:107
libyang::Attr::value_str
const char * value_str()
Definition: Tree_Data.hpp:305
libyang::Difflist::second
std::vector< S_Data_Node > second()
Definition: Tree_Data.cpp:627
lyd_node_leaf_list
Structure for data nodes defined as LYS_LEAF or LYS_LEAFLIST.
Definition: tree_data.h:217
libyang::Difflist
class for wrapping lyd_difflist.
Definition: Tree_Data.hpp:320
lyd_value_u::int8
int8_t int8
Definition: tree_data.h:105
libyang::Value::~Value
~Value()
Definition: Tree_Data.cpp:40
libyang::Data_Node::merge
int merge(S_Data_Node source, int options)
Definition: Tree_Data.cpp:253
LY_TYPE_UINT64
@ LY_TYPE_UINT64
Definition: tree_schema.h:804
libyang::Data_Node::merge_to_ctx
int merge_to_ctx(S_Data_Node source, int options, S_Context context)
Definition: Tree_Data.cpp:266
libyang::Data_Node_Leaf_List::change_leaf
int change_leaf(const char *val_str)
Definition: Tree_Data.cpp:561
libyang::Schema_Node
Definition: Tree_Schema.hpp:527
lyd_value_u::uint8
uint8_t uint8
Definition: tree_data.h:111
libyang::Data_Node::insert_attr
S_Attr insert_attr(S_Module module, const char *name, const char *value)
Definition: Tree_Data.cpp:484
libyang::Data_Node::Data_Node_Leaf_List
friend Data_Node_Leaf_List
Definition: Tree_Data.hpp:217
libyang::Value::ident
S_Ident ident()
Definition: Tree_Data.hpp:67
libyang::Difflist::Difflist
Difflist(struct lyd_difflist *diff, S_Deleter deleter)
Definition: Tree_Data.cpp:607
LY_TYPE_INT8
@ LY_TYPE_INT8
Definition: tree_schema.h:797
lyd_value_u
node's value representation
Definition: tree_data.h:94
libyang::Value::int64
int64_t int64()
Definition: Tree_Data.hpp:77
lyd_value_u::int16
int16_t int16
Definition: tree_data.h:106
lyd_value_u::binary
const char * binary
Definition: tree_data.h:95
lyd_attr
Attribute structure.
Definition: tree_data.h:128
libyang::Value::int8
int8_t int8()
Definition: Tree_Data.hpp:71
libyang
Definition: Libyang.hpp:30
lyd_value_u::ident
struct lys_ident * ident
Definition: tree_data.h:101
LY_TYPE_UINT8
@ LY_TYPE_UINT8
Definition: tree_schema.h:798
libyang::Data_Node::find_path
S_Set find_path(const char *expr)
Definition: Tree_Data.cpp:356
libyang::Decimal64
Definition: Tree_Data.hpp:41
libyang::Data_Node_Leaf_List::child
S_Data_Node child()
Definition: Tree_Data.hpp:248
LY_TYPE_INT64
@ LY_TYPE_INT64
Definition: tree_schema.h:803
libyang::Value::bit
std::vector< S_Type_Bit > bit()
Definition: Tree_Data.cpp:41
libyang::Attr::Attr
Attr(struct lyd_attr *attr, S_Deleter deleter=nullptr)
Definition: Tree_Data.cpp:596
libyang::Attr::name
const char * name()
Definition: Tree_Data.hpp:303
libyang::Data_Node::print_mem
std::string print_mem(LYD_FORMAT format, int options)
Definition: Tree_Data.cpp:504
libyang::Difflist::first
std::vector< S_Data_Node > first()
Definition: Tree_Data.cpp:613
libyang::Data_Node
classes for wrapping lyd_node.
Definition: Tree_Data.hpp:104
libyang::Value::int32
int32_t int32()
Definition: Tree_Data.hpp:75
libyang::Value::uint32
uint32_t uint32()
Definition: Tree_Data.hpp:87
libyang::Data_Node_Leaf_List::leaf_type
S_Type leaf_type()
Definition: Tree_Data.cpp:571
libyang::Data_Node_Leaf_List::value
S_Value value()
Definition: Tree_Data.cpp:556
libyang::Data_Node::path
std::string path()
Definition: Tree_Data.cpp:206
libyang::Data_Node::validate
int validate(int options, S_Context var_arg)
Definition: Tree_Data.cpp:384
libyang::Attr::value_type
LY_DATA_TYPE value_type()
Definition: Tree_Data.hpp:309
libyang::Data_Node_Anydata::~Data_Node_Anydata
~Data_Node_Anydata()
Definition: Tree_Data.cpp:594
libyang::Data_Node::validate_value
int validate_value(const char *value)
Definition: Tree_Data.cpp:405
libyang::Data_Node_Leaf_List::wd_default
int wd_default()
Definition: Tree_Data.cpp:568
lyd_node::when_status
uint8_t when_status
Definition: tree_data.h:180
libyang::Data_Node::unlink
int unlink()
Definition: Tree_Data.cpp:471
lyd_anydata_value
Anydata value union.
Definition: tree_data.h:262
libyang::Data_Node::child
virtual S_Data_Node child()
Definition: Tree_Data.hpp:148
lyd_value_u::dec64
int64_t dec64
Definition: tree_data.h:99
lyd_node
Generic structure for a data node, directly applicable to the data nodes defined as LYS_CONTAINER,...
Definition: tree_data.h:176
libyang::Data_Node_Leaf_List::value_type
LY_DATA_TYPE value_type()
Definition: Tree_Data.hpp:246
libyang::Value::leafref
S_Data_Node leafref()
Definition: Tree_Data.cpp:61
tree_data.h
libyang representation of data trees.
libyang::Difflist::type
LYD_DIFFTYPE * type()
Definition: Tree_Data.hpp:326
libyang::Attr::parent
S_Data_Node parent()
Definition: Tree_Data.hpp:298
libyang::Data_Node::tree_for
std::vector< S_Data_Node > tree_for()
Definition: Tree_Data.cpp:519
libyang::Value::dec64
Decimal64 dec64()
Definition: Tree_Data.hpp:63
LYD_FORMAT
LYD_FORMAT
Data input/output formats supported by libyang parser and printer functions.
Definition: tree_data.h:40
libyang::Data_Node::tree_dfs
std::vector< S_Data_Node > tree_dfs()
Definition: Tree_Data.cpp:529
LY_TYPE_UINT16
@ LY_TYPE_UINT16
Definition: tree_schema.h:800
lys_type_info::dec64
struct lys_type_info_dec64 dec64
Definition: tree_schema.h:960
libyang::Data_Node::attr
S_Attr attr()
Definition: Tree_Data.cpp:205
libyang::Value::instance
S_Data_Node instance()
Definition: Tree_Data.cpp:55
lys_type_info_dec64::dig
uint8_t dig
Definition: tree_schema.h:850
libyang::Data_Node::schema
S_Schema_Node schema()
Definition: Tree_Data.hpp:132
libyang::Value::uint16
uint16_t uint16()
Definition: Tree_Data.hpp:85
libyang::Data_Node_Leaf_List::~Data_Node_Leaf_List
~Data_Node_Leaf_List()
Definition: Tree_Data.cpp:555
libyang::Difflist::~Difflist
~Difflist()
Definition: Tree_Data.cpp:612
Tree_Schema.hpp
Class implementation for libyang C header tree_schema.h.
lyd_difflist::type
LYD_DIFFTYPE * type
Definition: tree_data.h:356
lyd_node_anydata
Structure for data nodes defined as LYS_ANYDATA or LYS_ANYXML.
Definition: tree_data.h:278
libyang::Data_Node::insert_sibling
int insert_sibling(S_Data_Node new_node)
Definition: Tree_Data.cpp:292
lyd_value_u::enm
struct lys_type_enum * enm
Definition: tree_data.h:100
libyang::Attr::next
S_Attr next()
Definition: Tree_Data.cpp:605
LY_DATA_TYPE
LY_DATA_TYPE
YANG built-in types.
Definition: tree_schema.h:784
lyd_value_u::string
const char * string
Definition: tree_data.h:110
libyang::Data_Node_Anydata
class for wrapping lyd_node_anydata.
Definition: Tree_Data.hpp:268
libyang::Data_Node_Leaf_List::value_str
const char * value_str()
Definition: Tree_Data.hpp:242
libyang::Data_Node::Data_Node
Data_Node(struct lyd_node *node, S_Deleter deleter=nullptr)
Definition: Tree_Data.cpp:68
LY_TYPE_ENUM
@ LY_TYPE_ENUM
Definition: tree_schema.h:791
libyang::Value::enm
S_Type_Enum enm()
Definition: Tree_Data.hpp:65
libyang::Data_Node::swig_deleter
S_Deleter swig_deleter()
Definition: Tree_Data.hpp:213
libyang::Decimal64::value
int64_t value
Definition: Tree_Data.hpp:42
lyd_value_u::int64
int64_t int64
Definition: tree_data.h:108
LY_TYPE_IDENT
@ LY_TYPE_IDENT
Definition: tree_schema.h:792
libyang::Value::string
const char * string()
Definition: Tree_Data.hpp:81
libyang::Data_Node_Anydata::child
S_Data_Node child()
Definition: Tree_Data.hpp:280
libyang::Data_Node::prev
S_Data_Node prev()
Definition: Tree_Data.hpp:144
libyang::Value::bln
int8_t bln()
Definition: Tree_Data.hpp:61
libyang::Data_Node::node_module
S_Module node_module()
Definition: Tree_Data.cpp:494
libyang::Value::uint8
uint8_t uint8()
Definition: Tree_Data.hpp:83
LYD_DIFFTYPE
LYD_DIFFTYPE
list of possible types of differences in lyd_difflist
Definition: tree_data.h:312
lyd_value_u::uint32
uint32_t uint32
Definition: tree_data.h:113
lyd_attr::value_str
const char * value_str
Definition: tree_data.h:133
libyang::Data_Node::dup_withsiblings
S_Data_Node dup_withsiblings(int recursive)
Definition: Tree_Data.cpp:230
LY_TYPE_INT16
@ LY_TYPE_INT16
Definition: tree_schema.h:799
LY_TYPE_DEC64
@ LY_TYPE_DEC64
Definition: tree_schema.h:789
libyang::Data_Node::insert_before
int insert_before(S_Data_Node new_node)
Definition: Tree_Data.cpp:311
libyang::Data_Node::dflt
uint8_t dflt()
Definition: Tree_Data.hpp:136
LY_TYPE_UINT32
@ LY_TYPE_UINT32
Definition: tree_schema.h:802
LY_TYPE_INT32
@ LY_TYPE_INT32
Definition: tree_schema.h:801
libyang::Data_Node::new_path
S_Data_Node new_path(S_Context ctx, const char *path, const char *value, LYD_ANYDATA_VALUETYPE value_type, int options)
Definition: Tree_Data.cpp:426
LY_TYPE_STRING
@ LY_TYPE_STRING
Definition: tree_schema.h:795
lyd_difflist
Structure for the result of lyd_diff(), describing differences between two data trees.
Definition: tree_data.h:355
libyang::create_new_Data_Node
S_Data_Node create_new_Data_Node(struct lyd_node *node)
Definition: Tree_Data.cpp:642
libyang::Value::int16
int16_t int16()
Definition: Tree_Data.hpp:73
lyd_value_u::bln
int8_t bln
Definition: tree_data.h:98
libyang::Data_Node::diff
S_Difflist diff(S_Data_Node second, int options)
Definition: Tree_Data.cpp:412
LYD_ANYDATA_VALUETYPE
LYD_ANYDATA_VALUETYPE
List of possible value types stored in lyd_node_anydata.
Definition: tree_data.h:50
libyang::Data_Node_Anydata::value_type
LYD_ANYDATA_VALUETYPE value_type()
Definition: Tree_Data.hpp:276
lyd_value_u::uint64
uint64_t uint64
Definition: tree_data.h:114
libyang::Data_Node::insert_after
int insert_after(S_Data_Node new_node)
Definition: Tree_Data.cpp:330
libyang::Data_Node::validity
uint8_t validity()
Definition: Tree_Data.hpp:134
libyang::Data_Node::next
S_Data_Node next()
Definition: Tree_Data.hpp:142
libyang::Value::binary
const char * binary()
Definition: Tree_Data.hpp:57
lyd_attr::value_type
LY_DATA_TYPE _PACKED value_type
Definition: tree_data.h:135
libyang::Value::uint64
uint64_t uint64()
Definition: Tree_Data.hpp:89
LY_TYPE_BOOL
@ LY_TYPE_BOOL
Definition: tree_schema.h:788
libyang::Attr::value
S_Value value()
Definition: Tree_Data.cpp:601
libyang::Data_Node::when_status
uint8_t when_status()
Definition: Tree_Data.hpp:138
lys_type::info
union lys_type_info info
Definition: tree_schema.h:982
lyd_value_u::uint16
uint16_t uint16
Definition: tree_data.h:112
libyang::Data_Node::find_instance
S_Set find_instance(S_Schema_Node schema)
Definition: Tree_Data.cpp:364
libyang::Decimal64::digits
uint8_t digits
Definition: Tree_Data.hpp:43
lyd_node::dflt
uint8_t dflt
Definition: tree_data.h:179
libyang::Data_Node::dup
S_Data_Node dup(int recursive)
Definition: Tree_Data.cpp:219
libyang::Data_Node::parent
S_Data_Node parent()
Definition: Tree_Data.hpp:146
libyang::Data_Node::swig_node
struct lyd_node * swig_node()
Definition: Tree_Data.hpp:211
libyang::Data_Node::dup_to_ctx
S_Data_Node dup_to_ctx(int recursive, S_Context context)
Definition: Tree_Data.cpp:241