vil_nitf2_field_definition.cxx
Go to the documentation of this file.
1 // vil_nitf2: Written by Harry Voorhees (hlv@) and Rob Radtke (rob@) of
2 // Stellar Science Ltd. Co. (stellarscience.com) for
3 // Air Force Research Laboratory, 2005.
4 
5 #include <utility>
8 
9 #include <cassert>
10 #ifdef _MSC_VER
11 # include <vcl_msvc_warnings.h>
12 #endif
13 
14 
15 //==============================================================================
16 // Class vil_nitf2_field_definition_node
17 
20 {
21  return is_field_definition() ? (vil_nitf2_field_definition*)this : nullptr;
22 }
23 
26 {
27  return is_repeat_node() ? (vil_nitf2_field_definition_repeat_node*)this : nullptr;
28 }
29 
30 //==============================================================================
31 // Class vil_nitf2_field_definition
32 
35  std::string pretty_name,
36  vil_nitf2_field_formatter* formatter,
37  bool blanks_ok,
38  vil_nitf2_field_functor<int>* width_functor,
39  vil_nitf2_field_functor<bool>* condition_functor,
40  std::string units,
41  std::string description)
42  : vil_nitf2_field_definition_node(type_field),
43  tag(std::move(tag)),
44  pretty_name(std::move(pretty_name)),
45  formatter(formatter),
46  blanks_ok(blanks_ok),
47  width_functor(width_functor),
48  condition_functor(condition_functor),
49  units(std::move(units)),
50  description(std::move(description))
51 {
52  assert(!tag.empty() && "vil_nitf2_field_definition:: null tag");
53  assert(formatter != nullptr && "vil_nitf2_field_definition:: null formatter");
54 }
55 
57 {
58  return new vil_nitf2_field_definition(
59  tag,
61  formatter->copy(),
62  blanks_ok,
63  width_functor ? width_functor->copy() : nullptr,
65  units,
66  description);
67 }
68 
70 {
71  return condition_functor == nullptr;
72 }
73 
75 {
76  return width_functor != nullptr;
77 }
78 
80 {
81  delete formatter;
82  delete width_functor;
83  delete condition_functor;
84 }
85 
86 //==============================================================================
87 // Class vil_nitf2_field_definitions
88 
90  const vil_nitf2_field_definitions& that)
91  : std::list<vil_nitf2_field_definition_node*>()
92 {
93  for (auto it : that)
94  {
95  push_back(it->copy());
96  }
97 }
98 
99 
101  std::string tag,
102  std::string pretty_name,
103  vil_nitf2_field_formatter* formatter,
104  bool blanks_ok,
105  vil_nitf2_field_functor<int>* width_functor,
106  vil_nitf2_field_functor<bool>* condition_functor,
107  std::string units,
108  std::string description)
109 {
110  push_back(new vil_nitf2_field_definition(
111  std::move(tag), std::move(pretty_name), formatter, blanks_ok,
112  width_functor, condition_functor, std::move(units), std::move(description)));
113  return *this;
114 }
115 
118  vil_nitf2_field_definitions& field_definitions )
119 {
121  repeat_functor,
122  new vil_nitf2_field_definitions(field_definitions)));
123  return *this;
124 }
125 
127 {
128  for (auto & it : *this)
129  {
130  delete it;
131  }
132 }
133 
134 //==============================================================================
135 // Class vil_nitf2_field_definition_repeat_node
136 
139 {
141  repeat_functor->copy(),
143 };
144 
146 {
147  delete repeat_functor;
148  delete field_definitions;
149 }
vil_nitf2_field_functor< int > * width_functor
virtual vil_nitf2_field_formatter * copy() const =0
vil_nitf2_field_definition_node * copy() const override
virtual vil_nitf2_field_functor< T > * copy() const =0
vil_nitf2_field_definitions & repeat(vil_nitf2_field_functor< int > *repeat_functor, vil_nitf2_field_definitions &field_definitions)
vil_nitf2_field_definitions & field(std::string tag, std::string pretty_name, vil_nitf2_field_formatter *formatter, bool blanks_ok=false, vil_nitf2_field_functor< int > *width_functor=nullptr, vil_nitf2_field_functor< bool > *condition_functor=nullptr, std::string units="", std::string description="")
vil_nitf2_field_definition_node * copy() const override
vil_nitf2_field_definition_repeat_node * repeat_node()
vil_nitf2_field_definition_repeat_node(vil_nitf2_field_functor< int > *repeat_functor, vil_nitf2_field_definitions *field_definitions)
vil_nitf2_field_formatter * formatter
vil_nitf2_field_functor< int > * repeat_functor
vil_nitf2_field_definition(std::string tag, std::string pretty_name, vil_nitf2_field_formatter *formatter, bool blanks_ok=false, vil_nitf2_field_functor< int > *width_functor=nullptr, vil_nitf2_field_functor< bool > *condition_functor=nullptr, std::string units="", std::string description="")
vil_nitf2_field_functor< bool > * condition_functor
vil_nitf2_field_definition * field_definition()