vil_nitf2_tagged_record_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 <iostream>
6 #include <utility>
10 #ifdef _MSC_VER
11 # include <vcl_msvc_warnings.h>
12 #endif
13 
14 
17 {
18  class tagged_record_definition_map_t: public vil_nitf2_tagged_record_definition::tagged_record_definition_map
19  {
20  public:
21  ~tagged_record_definition_map_t()
22  {
23  for (auto & it : *this) {
24  delete it.second;
25  }
26  }
27  };
28 
29  static tagged_record_definition_map_t tagged_record_definitions;
30  return tagged_record_definitions;
31 }
32 
33 
35  std::string name, std::string pretty_name, vil_nitf2_field_definitions* defs)
36  : m_name(std::move(name)),
37  m_pretty_name(std::move(pretty_name)),
38  m_field_definitions(defs ? defs : new vil_nitf2_field_definitions()),
39  m_definition_completed(false)
40 {
41 }
42 
44  std::string name, std::string pretty_name)
45 {
47  new vil_nitf2_tagged_record_definition(name, std::move(pretty_name));
48  if (all_definitions().find(name) != all_definitions().end()) {
49  throw("vil_nitf2_tagged_record_definition already defined.");
50  }
51  all_definitions().insert(std::make_pair(name, definition));
52  return *definition;
53 }
54 
55 bool vil_nitf2_tagged_record_definition::undefine(const std::string& name)
56 {
57  auto definition = all_definitions().find(name);
58  if (definition == all_definitions().end()) {
59  return false;
60  }
61  delete definition->second;
62  all_definitions().erase(definition);
63  return true;
64 }
65 
67  std::string tag,
68  std::string pretty_name,
69  vil_nitf2_field_formatter* formatter,
70  bool blanks_ok,
71  vil_nitf2_field_functor<int>* width_functor,
72  vil_nitf2_field_functor<bool>* condition_functor,
73  std::string units,
74  std::string description)
75 {
77  std::cerr << "vil_nitf2_tagged_record_definition:field() failed; definition already complete.";
78  } else {
80  std::move(tag), std::move(pretty_name), formatter, blanks_ok,
81  width_functor, condition_functor, std::move(units), std::move(description));
82  m_field_definitions->push_back(field_definition);
83  }
84  return *this;
85 }
86 
89  vil_nitf2_field_definitions& field_definitions)
90 {
92  std::cerr << "vil_nitf2_tagged_record_definition:repeat() failed; definition already complete.";
93  } else {
94  m_field_definitions->push_back(
96  repeat_functor,
98  }
99  return *this;
100 }
101 
103 {
104  m_definition_completed = true;
105 }
106 
108 {
109  auto definition = all_definitions().find(name);
110  if (definition == all_definitions().end()) return nullptr;
111  return definition->second;
112 }
113 
115 {
116  delete m_field_definitions;
117 }
118 
120  std::string int_tag, vil_nitf2_field_definitions& field_definitions)
121 {
122  return repeat(new vil_nitf2_field_value<int>(std::move(int_tag)), field_definitions);
123 }
124 
126  int repeat_count, vil_nitf2_field_definitions& field_definitions)
127 {
128  return repeat(new vil_nitf2_constant_functor<int>(repeat_count), field_definitions);
129 }
130 
132 {
133  define("PIAIMB", "Profile for Imagery Archives Image" )
134  .field("CLOUDCVR", "Cloud Cover", NITF_INT(3), true)
135  .field("SRP", "Standard Radiometric Product", NITF_CHAR(), true)
136  .field("SENSMODE", "Sensor Mode", NITF_STR(12), true)
137  .field("SENSNAME", "Sensor Name", NITF_STR(18), true)
138  .field("SOURCE", "Source", NITF_STR(255), true)
139  .field("COMGEN", "Compression Generation", NITF_INT(2), true)
140  .field("SUBQUAL", "Subjective Quality", NITF_CHAR(), true)
141  .field("PIAMSNNUM", "PIA Mission Number", NITF_STR(7), true)
142  .field("CAMSPECS", "Camera Specs", NITF_STR(32), true)
143  .field("PROJID", "Project ID Code", NITF_STR(2), true)
144  .field("GENERATION", "Generation", NITF_INT(1), true)
145  .field("ESD", "Exploitation Support Data", NITF_CHAR(), true)
146  .field("OTHERCOND", "Other Conditions", NITF_STR(2), true)
147  .end();
148 }
Functor vil_nitf2_field_value defines a function that sets its out parameter to a value of a field fr...
#define NITF_INT
std::map< std::string, vil_nitf2_tagged_record_definition * > tagged_record_definition_map
static void register_test_tre()
Registers some TREs for testing.
void end()
Declares that definition is finished, preventing further invocations of field() or repeat().
#define NITF_STR
vil_nitf2_tagged_record_definition & field(std::string field_name, 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="")
Define a field. Assumes ownership of pointer arguments.
vil_nitf2_tagged_record_definition(const vil_nitf2_tagged_record_definition &)
static vil_nitf2_tagged_record_definition & define(std::string name, std::string pretty_name)
Factory method. Assumes ownership of optional pointer argument.
const vil_nitf2_field_definitions & field_definitions() const
Return field definitions.
vil_nitf2: Written by Harry Voorhees (hlv@) and Rob Radtke (rob@) of Stellar Science Ltd.
vil_nitf2_tagged_record_definition defines a particular tagged record extension (TRE).
static tagged_record_definition_map & all_definitions()
All tagged record definitions.
static bool undefine(const std::string &name)
Undefines a TRE. Returns whether TRE with specified name was found.
#define NITF_CHAR
static vil_nitf2_tagged_record_definition * find(const std::string &name)
Look up a record definition.
vil_nitf2_tagged_record_definition & repeat(vil_nitf2_field_functor< int > *repeat_functor, vil_nitf2_field_definitions &field_definitions)
Define a repeat node. Assumes ownership of pointer argument.