Flow123d  jenkins-Flow123d-linux-release-multijob-282
type_output.hh
Go to the documentation of this file.
1 /*
2  * type_output.hh
3  *
4  * Created on: Nov 26, 2012
5  * Author: jb
6  */
7 
8 #ifndef TYPE_OUTPUT_HH_
9 #define TYPE_OUTPUT_HH_
10 
11 
12 #include "input/type_base.hh"
13 #include "input/type_record.hh"
14 #include <boost/regex.hpp>
15 
16 
17 namespace Input {
18 
19 namespace Type {
20 
21 /**
22  * @brief Base abstract class for output description of the Input::Type tree.
23  *
24  * Output into various formats is implemented by derived classes:
25  * - OutputText - for human readable description
26  * - OutputJSONTemplate - for creating a template of the input file
27  * - OutputLatex - for printed documentation (with support of particular Latex macros)
28  * - OutputJSONMachine - for full machine readable description in standard JSON format
29  *
30  * Usage example:
31  * @code
32  * cout << OutputText( &my_record, 3) << endl;
33  * @endcode
34  *
35  * @ingroup input_types
36  */
37 class OutputBase {
38 public:
39 
40  /**
41  * @brief Performs output of the documentation into given @p stream. The same effect has the reloaded operator '<<'.
42  * Returns reference to the same stream.
43  */
44  virtual ostream& print(ostream& stream);
45 
46  /**
47  * @brief Initializes and allocates regular expression filter @p regex_filter.
48  *
49  * Full names of Input::Type::Record objects are passed through the filter, deleting the first match of the regular expression given by @p regex_filter.
50  * Full Record description is performed only for the first occurrence of the filtered name, further Records with same filtered name are ignored
51  * (reported only in short descriptions of individual keys or array subtype, etc.) See @p ProcessedTypes for details.
52  */
53  void set_filter(string regex_filter);
54 
55 protected:
56  /**
57  * Types of documentation output.
58  *
59  * Used in print_impl methods for basic and full printout of Input::Type
60  */
62  key_record, ///< Printout only basic data
63  full_record ///< Printout full documentation
64  };
65 
66 
67 
68  /**
69  * Constructor
70  *
71  * @param type Stores input sequence
72  * @param depth Depth of output
73  */
74  OutputBase(const TypeBase *type, unsigned int depth = 0);
75 
76 
77  /// Destructor
78  virtual ~OutputBase();
79 
80  // data getters
81  /// Gets range of array
82  void get_array_sizes(Array array, unsigned int &lower , unsigned int &upper );
83  /// Gets description of the given record type.
84  const string & get_record_description(const Record *rec);
85  /// Gets record key for given index
86  void get_record_key(Record rec, unsigned int key_idx, Record::Key &key);
87  /// Gets range of integer
88  void get_integer_bounds(Integer integer, int &lower , int &upper );
89  /// Gets range of double
90  void get_double_bounds(Double dbl, double &lower , double &upper );
91  /// Gets pointer of parent AbstractRecord for given Record
92  void get_parent_ptr(Record rec, boost::shared_ptr<AbstractRecord> &parent_ptr);
93  /// Gets pointer of inner type for given Array
94  void get_array_type(Array array, boost::shared_ptr<const TypeBase> &arr_type);
95  /// Gets values of default for given record key
96  void get_default(Record::KeyIter it, string &type, string &value);
97  /// Gets description of the given selection type.
98  const string & get_selection_description(const Selection *sel);
99  /// Gets parent_name_ of the given AdHocAbstractRecord type.
100  const string & get_adhoc_parent_name(const AdHocAbstractRecord *a_rec);
101  /// Gets iterator to begin of parent_data_ of the given AdHocAbstractRecord type.
103 
104 
105  /// Gets pointer of inner data for given Record
106  const void * get_record_data(const Record *rec);
107  /// Gets pointer of inner data for given AbstractRecord
108  const void * get_abstract_record_data(const AbstractRecord *a_rec);
109  /// Gets pointer of inner data for given Selection
110  const void * get_selection_data(const Selection *sel);
111  /// Gets pointer of inner data for given Array
112  const void * get_array_data(const Array *array);
113  /// Gets pointer of inner data for given TypeBase
114  const void * get_type_base_data(const TypeBase *type);
115 
116 
117  /**
118  * Perform resolution according to actual @p type (using typeid) and call particular print_impl method.
119  */
120  void print(ostream& stream, const TypeBase *type, unsigned int depth);
121 
122 
123  /**
124  * Implements printout of Record @p type
125  */
126  virtual void print_impl(ostream& stream, const Record *type, unsigned int depth) = 0;
127  /**
128  * Implements printout of Array @p type
129  */
130  virtual void print_impl(ostream& stream, const Array *type, unsigned int depth) = 0;
131  /**
132  * Implements printout of AbstractRecord @p type
133  */
134  virtual void print_impl(ostream& stream, const AbstractRecord *type, unsigned int depth) = 0;
135  /**
136  * Implements printout of AdHocAbstractRecord @p type
137  */
138  virtual void print_impl(ostream& stream, const AdHocAbstractRecord *type, unsigned int depth) = 0;
139  /**
140  * Implements printout of Selection @p type
141  */
142  virtual void print_impl(ostream& stream, const Selection *type, unsigned int depth) = 0;
143  /**
144  * Implements printout of Integer @p type
145  */
146  virtual void print_impl(ostream& stream, const Integer *type, unsigned int depth) = 0;
147  /**
148  * Implements printout of Double @p type
149  */
150  virtual void print_impl(ostream& stream, const Double *type, unsigned int depth) = 0;
151  /**
152  * Implements printout of Bool @p type
153  */
154  virtual void print_impl(ostream& stream, const Bool *type, unsigned int depth) = 0;
155  /**
156  * Implements printout of String @p type
157  */
158  virtual void print_impl(ostream& stream, const String *type, unsigned int depth) = 0;
159  /**
160  * Implements printout of FileName @p type
161  */
162  virtual void print_impl(ostream& stream, const FileName *type, unsigned int depth) = 0;
163 
164  /**
165  * Write out a string with given padding of every new line.
166  *
167  * @param stream Output stream
168  * @param str Printed description
169  * @param padding Number of spaces added from left
170  * @param hash_count Count of '#' chars in description
171  */
172  void write_description(std::ostream& stream, const string& str, unsigned int padding, unsigned int hash_count = 1);
173  /**
174  * Write value stored in @p dft.
175  *
176  * Enclose value in quotes if it's needed or write info that value is optional or obligatory.
177  */
178  void write_default_value(std::ostream& stream, Default dft);
179 
180 
181  /// Padding of new level of printout, used where we use indentation.
182  static const unsigned int padding_size = 4;
183  /// Object for which is created printout
184  const TypeBase *type_;
185  /// Depth of printout (for value 0 is printed all input tree)
186  unsigned int depth_;
187  /// Type of documentation output
189  /// temporary value for printout of description (used in std::setw function)
190  unsigned int size_setw_;
191 
192  /// Header of the format, printed before first call of recursive print.
193  /// see @p print(stream) method
194  std::string format_head;
195  /// Tail of the format, printed after all recursive prints are finished.
196  /// see @p print(stream) method
197  std::string format_tail;
198 
199  /**
200  * @brief Internal data class.
201  * Contains flags of written Input::Types objects and functionality of regular expression filter of Input::Types full names.
202  *
203  * Flags are stored to struct that contains unique internal data pointer of complex Input::Type,
204  * flag if extensive documentation was printed and reference to Input::Type.
205  *
206  * Regular expression filter is optional and stores printed Input::Type by filtered full_name.
207  * Input::Types with similar full names are printed only once.
208  */
210  public:
211 
212  /**
213  * Structure for flags about output of one TypeBase object in input tree
214  * Stores types what was printed
215  */
216  struct Key {
217  unsigned int key_index; ///< Position inside the record.
218  const void * type_data_; ///< Pointer to internal data of type.
219  mutable string reference_; ///< Reference to type.
220  };
221  /**
222  * Public typedef of constant iterator into array of keys.
223  */
225 
226 
227  /// Clear all data of processed types
228  void clear();
229 
230  /**
231  * Interface to mapping key -> index. Returns index (in continuous array) for given type.
232  */
233  unsigned int type_index(const void * type_data) const;
234 
235  /// Destructor, deallocates filter_ if it was allocated.
236  ~ProcessedTypes();
237 
238  /**
239  * Returns true if the type was printed out
240  *
241  * Checks if the ProcessedTypes contains key of given type and key has true flag extensive_doc_
242  * or if the ProcessedTypes contains type of given full_name when regular expression filter_ is initialized.
243  */
244  bool was_written(const void * type_data, string full_name);
245 
246  /**
247  * Marks type as written.
248  *
249  * Inserts type to key_to_index map.
250  * If regular expression filter_ is initialized marks filtered full_name of type as written.
251  */
252  void mark_written(const void *type_data, string full_name, string reference = "");
253  /**
254  * Returns reference_ string of key of given type.
255  */
256  const string get_reference(const void * type_data) const;
257 
258  /**
259  * Combines was_sritten and mark_written for hashes.
260  */
261  bool was_written(std::size_t hash)
262  {
263  bool in_set = ( output_hash.find(hash) != output_hash.end() );
264  if (! in_set) output_hash.insert(hash);
265  return in_set;
266  }
267 
268 
269  /// Database of valid keys
272 
273  /// Keys in order as they where declared.
275 
276  /// Regex filter for full names.
277  boost::regex *filter_;
278 
279  /// Regular expression of filter
280  string reg_exp_;
281 
282  /// Set of processed types by regular expression and full names
283  std::set<string> full_type_names;
284 
285  /// Set of hashes of outputed types. Should replace keys.
286  std::set<std::size_t> output_hash;
287  };
288 
289  /// Stores flags and references of processed type
291 
292 };
293 
294 
295 /**********************************************************************************************************************/
296 
297 /**
298  * @brief Class for create text documentation
299  *
300  * Record, AbstractRecord and Selection are represented by block of text that contains type name, name, description
301  * and count and list of keys (for Record), descendants (for AbstractRecord) or values (for Selection).
302  *
303  * In list are displayed information about subtypes, e.g. type name, description, value, range of numeric values etc.
304  *
305  * @ingroup input_types
306  */
307 class OutputText : public OutputBase {
308 public:
309  OutputText(const TypeBase *type, unsigned int depth = 0) : OutputBase(type, depth) {}
310 
311 protected:
312 
313  void print_impl(ostream& stream, const Record *type, unsigned int depth);
314  void print_impl(ostream& stream, const Array *type, unsigned int depth);
315  void print_impl(ostream& stream, const AbstractRecord *type, unsigned int depth);
316  void print_impl(ostream& stream, const AdHocAbstractRecord *type, unsigned int depth);
317  void print_impl(ostream& stream, const Selection *type, unsigned int depth);
318  void print_impl(ostream& stream, const Integer *type, unsigned int depth);
319  void print_impl(ostream& stream, const Double *type, unsigned int depth);
320  void print_impl(ostream& stream, const Bool *type, unsigned int depth);
321  void print_impl(ostream& stream, const String *type, unsigned int depth);
322  void print_impl(ostream& stream, const FileName *type, unsigned int depth);
323 
324 
325 };
326 
327 
328 
329 
330 
331 
332 
333 /**
334  * @brief Class for create and JSON template documentation
335  *
336  * Every type is represented by JSON object.
337  * Type name, description and other data are displayed as comments.
338  * Among other data belongs range of numeric values, size limits of arrays, possible values of selections etc.
339  *
340  *
341  * @ingroup input_types
342  */
344 public:
345  /**
346  * Constructor for output of the input type tree with root @p type.
347  * The input type tree is searched by DFS algorithm into @p depth.
348  */
349  OutputJSONTemplate(TypeBase *type, unsigned int depth = 0) : OutputBase(type, depth) {}
350 
351  /**
352  * Perform output of the documentation into given stream.
353  */
354  ostream& print(ostream& stream);
355 
356 protected:
357  // Need to implement the resolution function. Just call that in the base class.
358  void print(ostream& stream, const TypeBase *type, unsigned int depth) {
359  OutputBase::print(stream, type, depth);
360  }
361 
362 
363  void print_impl(ostream& stream, const Record *type, unsigned int depth);
364  void print_impl(ostream& stream, const Array *type, unsigned int depth);
365  void print_impl(ostream& stream, const AbstractRecord *type, unsigned int depth);
366  void print_impl(ostream& stream, const AdHocAbstractRecord *type, unsigned int depth);
367  void print_impl(ostream& stream, const Selection *type, unsigned int depth);
368  void print_impl(ostream& stream, const Integer *type, unsigned int depth);
369  void print_impl(ostream& stream, const Double *type, unsigned int depth);
370  void print_impl(ostream& stream, const Bool *type, unsigned int depth);
371  void print_impl(ostream& stream, const String *type, unsigned int depth);
372  void print_impl(ostream& stream, const FileName *type, unsigned int depth);
373 
374 private:
375  /**
376  * Prints value according to DefaultType
377  * Respects obligatory, optional and read time flag
378  *
379  * @param stream Output stream
380  * @param depth Depth of output
381  * @param empty_val Default empty value (zero for numeric types, empty string ...)
382  * @param invalid_val Flag if value is invalid for its type
383  * @param has_quote Flag if value is enclosed in quotes
384  */
385  void print_default_value(ostream& stream, unsigned int depth, string empty_val, bool invalid_val, bool has_quote = false);
386 
387  /// temporary value of actually record type
388  string key_name_;
389  /// temporary value of actually reference
390  string reference_;
391  /// temporary value of actually record value
393 };
394 
395 
396 
397 
398 /**
399  * @brief Class for create documentation in Latex format using particular macros.
400  *
401  * @ingroup input_types
402  */
403 class OutputLatex : public OutputBase {
404 public:
405  OutputLatex(TypeBase *type, unsigned int depth = 0) : OutputBase(type, depth) {}
406 
407  ostream & print(ostream& stream);
408 
409 protected:
410 
411  // Need to implement the resolution function. Just call that in the base class.
412  void print(ostream& stream, const TypeBase *type, unsigned int depth) {
413  OutputBase::print( stream, type, depth);
414  }
415 
416  void print_impl(ostream& stream, const Record *type, unsigned int depth);
417  void print_impl(ostream& stream, const Array *type, unsigned int depth);
418  void print_impl(ostream& stream, const AbstractRecord *type, unsigned int depth);
419  void print_impl(ostream& stream, const AdHocAbstractRecord *type, unsigned int depth);
420  void print_impl(ostream& stream, const Selection *type, unsigned int depth);
421  void print_impl(ostream& stream, const Integer *type, unsigned int depth);
422  void print_impl(ostream& stream, const Double *type, unsigned int depth);
423  void print_impl(ostream& stream, const Bool *type, unsigned int depth);
424  void print_impl(ostream& stream, const String *type, unsigned int depth);
425  void print_impl(ostream& stream, const FileName *type, unsigned int depth);
426 
427 
428 };
429 
430 
431 /**
432  * @brief Class for create JSON machine readable documentation
433  *
434  * Every type is represented by one JSON object, for Selection e.g.:
435  * "name" : (string),
436  * "full_name" : (string),
437  * "type" : "Selection",
438  * "values" : [ { "value" : (int), "name": (string), "description" : (string) } ]
439  *
440  * @ingroup input_types
441  */
443 public:
444  OutputJSONMachine(TypeBase *type, unsigned int depth = 0) : OutputBase(type, depth)
445  {
446  format_head="[\n";
447  format_tail="{}]\n";
448  }
449 
450 protected:
451 
452  std::string format_hash(std::size_t hash);
453  std::string escape_description(std::string desc);
454 
455  void print_impl(ostream& stream, const Record *type, unsigned int depth);
456  void print_impl(ostream& stream, const Array *type, unsigned int depth);
457  void print_impl(ostream& stream, const AbstractRecord *type, unsigned int depth);
458  void print_impl(ostream& stream, const AdHocAbstractRecord *type, unsigned int depth);
459  void print_impl(ostream& stream, const Selection *type, unsigned int depth);
460  void print_impl(ostream& stream, const Integer *type, unsigned int depth);
461  void print_impl(ostream& stream, const Double *type, unsigned int depth);
462  void print_impl(ostream& stream, const Bool *type, unsigned int depth);
463  void print_impl(ostream& stream, const String *type, unsigned int depth);
464  void print_impl(ostream& stream, const FileName *type, unsigned int depth);
465 
466 
467  /// Print all keys of AbstractRecord type or AdHocAbstractRecord type
468  void print_abstract_record_keys(ostream& stream, const AbstractRecord *type, unsigned int depth);
469 };
470 
471 
472 /**
473  * Overrides output operator for simple output of the input type tree.
474  */
475 std::ostream& operator<<(std::ostream& stream, OutputText type_output);
476 std::ostream& operator<<(std::ostream& stream, OutputJSONTemplate type_output);
477 std::ostream& operator<<(std::ostream& stream, OutputLatex type_output);
478 std::ostream& operator<<(std::ostream& stream, OutputJSONMachine type_output);
479 
480 
481 
482 } // closing namespace Type
483 } // closing namespace Input
484 
485 
486 
487 
488 #endif /* TYPE_OUTPUT_HH_ */
std::string escape_description(std::string desc)
Base of classes for declaring structure of the input data.
Definition: type_base.hh:63
std::vector< struct Key >::const_iterator KeyIter
Definition: type_record.hh:200
unsigned int type_index(const void *type_data) const
Definition: type_output.cc:263
void write_default_value(std::ostream &stream, Default dft)
Definition: type_output.cc:214
void get_default(Record::KeyIter it, string &type, string &value)
Gets values of default for given record key.
Definition: type_output.cc:102
void get_integer_bounds(Integer integer, int &lower, int &upper)
Gets range of integer.
Definition: type_output.cc:56
Class Input::Type::Default specifies default value of keys of a Input::Type::Record.
Definition: type_record.hh:39
Class for declaration of the input of type Bool.
Definition: type_base.hh:332
string reference_
temporary value of actually reference
Definition: type_output.hh:390
void get_array_type(Array array, boost::shared_ptr< const TypeBase > &arr_type)
Gets pointer of inner type for given Array.
Definition: type_output.cc:77
const void * get_record_data(const Record *rec)
Gets pointer of inner data for given Record.
Definition: type_output.cc:134
bool was_written(const void *type_data, string full_name)
Definition: type_output.cc:271
void print_abstract_record_keys(ostream &stream, const AbstractRecord *type, unsigned int depth)
Print all keys of AbstractRecord type or AdHocAbstractRecord type.
Base abstract class for output description of the Input::Type tree.
Definition: type_output.hh:37
Internal data class. Contains flags of written Input::Types objects and functionality of regular expr...
Definition: type_output.hh:209
string reg_exp_
Regular expression of filter.
Definition: type_output.hh:280
OutputJSONMachine(TypeBase *type, unsigned int depth=0)
Definition: type_output.hh:444
void print_default_value(ostream &stream, unsigned int depth, string empty_val, bool invalid_val, bool has_quote=false)
Definition: type_output.cc:886
DocumentationType doc_type_
Type of documentation output.
Definition: type_output.hh:188
Class for create JSON machine readable documentation.
Definition: type_output.hh:442
void set_filter(string regex_filter)
Initializes and allocates regular expression filter regex_filter.
Definition: type_output.cc:49
void print_impl(ostream &stream, const Record *type, unsigned int depth)
string key_name_
temporary value of actually record type
Definition: type_output.hh:388
unsigned int depth_
Depth of printout (for value 0 is printed all input tree)
Definition: type_output.hh:186
AbstractRecord::ChildDataIter get_adhoc_parent_data(const AdHocAbstractRecord *a_rec)
Gets iterator to begin of parent_data_ of the given AdHocAbstractRecord type.
Definition: type_output.cc:127
ostream & print(ostream &stream)
Performs output of the documentation into given stream. The same effect has the reloaded operator &#39;&lt;&l...
Class for declaration of the input data that are file names.
Definition: type_base.hh:456
static const unsigned int padding_size
Padding of new level of printout, used where we use indentation.
Definition: type_output.hh:182
void print_impl(ostream &stream, const Record *type, unsigned int depth)
Definition: type_output.cc:317
Class for declaration of the integral input data.
Definition: type_base.hh:355
void get_array_sizes(Array array, unsigned int &lower, unsigned int &upper)
Gets range of array.
Definition: type_output.cc:70
void mark_written(const void *type_data, string full_name, string reference="")
Definition: type_output.cc:282
Class for declaration of inputs sequences.
Definition: type_base.hh:239
ostream & print(ostream &stream)
Definition: type_output.cc:563
void print_impl(ostream &stream, const Record *type, unsigned int depth)
Definition: type_output.cc:569
const string & get_record_description(const Record *rec)
Gets description of the given record type.
Definition: type_output.cc:83
std::set< std::size_t > output_hash
Set of hashes of outputed types. Should replace keys.
Definition: type_output.hh:286
void get_parent_ptr(Record rec, boost::shared_ptr< AbstractRecord > &parent_ptr)
Gets pointer of parent AbstractRecord for given Record.
Definition: type_output.cc:96
void get_double_bounds(Double dbl, double &lower, double &upper)
Gets range of double.
Definition: type_output.cc:63
void clear()
Clear all data of processed types.
Definition: type_output.cc:253
Class for declaration of the input data that are floating point numbers.
Definition: type_base.hh:392
const void * get_array_data(const Array *array)
Gets pointer of inner data for given Array.
Definition: type_output.cc:147
OutputLatex(TypeBase *type, unsigned int depth=0)
Definition: type_output.hh:405
unsigned int key_index
Position inside the record.
Definition: type_output.hh:217
Printout only basic data.
Definition: type_output.hh:62
virtual ostream & print(ostream &stream)
Performs output of the documentation into given stream. The same effect has the reloaded operator &#39;&lt;&l...
Definition: type_output.cc:38
unsigned int size_setw_
temporary value for printout of description (used in std::setw function)
Definition: type_output.hh:190
OutputJSONTemplate(TypeBase *type, unsigned int depth=0)
Definition: type_output.hh:349
Class for declaration of polymorphic Record.
Definition: type_record.hh:487
boost::regex * filter_
Regex filter for full names.
Definition: type_output.hh:277
virtual void print_impl(ostream &stream, const Record *type, unsigned int depth)=0
Default value_
temporary value of actually record value
Definition: type_output.hh:392
const void * get_abstract_record_data(const AbstractRecord *a_rec)
Gets pointer of inner data for given AbstractRecord.
Definition: type_output.cc:138
const string get_reference(const void *type_data) const
Definition: type_output.cc:299
std::map< const void *, unsigned int > key_to_index
Database of valid keys.
Definition: type_output.hh:270
void print_impl(ostream &stream, const Record *type, unsigned int depth)
std::vector< struct Key > keys
Keys in order as they where declared.
Definition: type_output.hh:274
const void * type_data_
Pointer to internal data of type.
Definition: type_output.hh:218
const string & get_adhoc_parent_name(const AdHocAbstractRecord *a_rec)
Gets parent_name_ of the given AdHocAbstractRecord type.
Definition: type_output.cc:122
Class for create documentation in Latex format using particular macros.
Definition: type_output.hh:403
Printout full documentation.
Definition: type_output.hh:63
void get_record_key(Record rec, unsigned int key_idx, Record::Key &key)
Gets record key for given index.
Definition: type_output.cc:89
Class for create and JSON template documentation.
Definition: type_output.hh:343
std::map< const void *, unsigned int >::const_iterator key_to_index_const_iter
Definition: type_output.hh:271
const string & get_selection_description(const Selection *sel)
Gets description of the given selection type.
Definition: type_output.cc:117
void write_description(std::ostream &stream, const string &str, unsigned int padding, unsigned int hash_count=1)
Definition: type_output.cc:222
void print(ostream &stream, const TypeBase *type, unsigned int depth)
Definition: type_output.hh:358
OutputText(const TypeBase *type, unsigned int depth=0)
Definition: type_output.hh:309
std::string format_hash(std::size_t hash)
void print(ostream &stream, const TypeBase *type, unsigned int depth)
Definition: type_output.hh:412
virtual ~OutputBase()
Destructor.
Definition: type_output.cc:25
std::ostream & operator<<(std::ostream &stream, const TypeBase &type)
Definition: type_base.cc:130
std::vector< struct Key >::const_iterator KeyIter
Definition: type_output.hh:224
ProcessedTypes doc_flags_
Stores flags and references of processed type.
Definition: type_output.hh:290
~ProcessedTypes()
Destructor, deallocates filter_ if it was allocated.
Definition: type_output.cc:246
Class for create text documentation.
Definition: type_output.hh:307
Record type proxy class.
Definition: type_record.hh:169
std::vector< Record >::const_iterator ChildDataIter
Definition: type_record.hh:518
const TypeBase * type_
Object for which is created printout.
Definition: type_output.hh:184
std::set< string > full_type_names
Set of processed types by regular expression and full names.
Definition: type_output.hh:283
const void * get_selection_data(const Selection *sel)
Gets pointer of inner data for given Selection.
Definition: type_output.cc:142
const void * get_type_base_data(const TypeBase *type)
Gets pointer of inner data for given TypeBase.
Definition: type_output.cc:152
Template for classes storing finite set of named values.
OutputBase(const TypeBase *type, unsigned int depth=0)
Definition: type_output.cc:29