The Battle for Wesnoth  1.13.4+dev
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
help_impl.hpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2003 - 2016 by David White <[email protected]>
3  Part of the Battle for Wesnoth Project http://www.wesnoth.org/
4 
5  This program is free software; you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation; either version 2 of the License, or
8  (at your option) any later version.
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY.
11 
12  See the COPYING file for more details.
13 */
14 
15 /**
16  * Note:
17  * Prior to the creation of this file, all the code associated to the help
18  * browser existed in a single file src/help.cpp, including all of the
19  * widgets, topic generators, and implementation details. This totaled
20  * ~4000 lines of code.
21  *
22  * I have split it all up now, so that the gui aspects are separated from
23  * the content, the "front facing" part which the rest of the code base
24  * interacts with is in src/help/help.?pp, and the topic generators are
25  * separated. The remaining "guts" are here. It is implemented in a static
26  * singleton pattern, using "extern"'d variables, simply for ease of translation
27  * from the previous state. It would probably be a good idea to rewrite this
28  * guy as a proper C++ object. Feel free to do so, or to adopt some other
29  * design pattern.
30  */
31 
32 #ifndef HELP_IMPL_INCLUDED
33 #define HELP_IMPL_INCLUDED
34 
35 #include "exceptions.hpp" // for error
36 #include "font.hpp" // for line_width, relative_size
37 
38 #include <cstring>
39 #include <list> // for list
40 #include <ostream> // for operator<<, stringstream, etc
41 #include <string> // for string, allocator, etc
42 #include <utility> // for pair, make_pair
43 #include <vector> // for vector, etc
44 #include <boost/shared_ptr.hpp>
45 #include <SDL.h> // for SDL_Color, SDL_Surface
46 
47 class config;
48 class unit_type;
51 namespace help { struct section; } // lines 51-51
52 
53 namespace help {
54 
55 /// Generate the help contents from the configurations given to the
56 /// manager.
57 void generate_contents();
58 
59 typedef std::vector<section *> section_list;
60 
61 /// Generate a topic text on the fly.
63 {
64  unsigned count;
65  friend class topic_text;
66 public:
67  topic_generator(): count(1) {}
68  virtual std::string operator()() const = 0;
69  virtual ~topic_generator() {}
70 };
71 
74 public:
75  text_topic_generator(std::string const &t): text_(t) {}
76  virtual std::string operator()() const { return text_; }
77 };
78 
79 /// The text displayed in a topic. It is generated on the fly with the information
80 /// contained in generator_.
82 {
83  mutable std::vector< std::string > parsed_text_;
85 public:
86  ~topic_text();
88  parsed_text_(),
89  generator_(nullptr)
90  {
91  }
92 
94  parsed_text_(),
95  generator_(new text_topic_generator(t))
96  {
97  }
98 
100  parsed_text_(),
101  generator_(g)
102  {
103  }
105  topic_text(topic_text const &t);
106 
107  const std::vector<std::string>& parsed_text() const;
108 };
109 
110 /// A topic contains a title, an id and some text.
111 struct topic
112 {
113  topic() :
114  title(),
115  id(),
116  text()
117  {
118  }
119 
120  topic(const std::string &_title, const std::string &_id) :
121  title(_title),
122  id(_id),
123  text()
124  {
125  }
126 
127  topic(const std::string &_title, const std::string &_id, const std::string &_text)
128  : title(_title), id(_id), text(_text) {}
129  topic(const std::string &_title, const std::string &_id, topic_generator *g)
130  : title(_title), id(_id), text(g) {}
131  /// Two topics are equal if their IDs are equal.
132  bool operator==(const topic &) const;
133  bool operator!=(const topic &t) const { return !operator==(t); }
134  /// Comparison on the ID.
135  bool operator<(const topic &) const;
137  mutable topic_text text;
138 };
139 
140 typedef std::list<topic> topic_list;
141 
142 /// A section contains topics and sections along with title and ID.
143 struct section {
145  title(""),
146  id(""),
147  topics(),
148  sections(),
149  level()
150  {
151  }
152 
153  section(const section&);
154  section& operator=(const section&);
155  ~section();
156  /// Two sections are equal if their IDs are equal.
157  bool operator==(const section &) const;
158  /// Comparison on the ID.
159  bool operator<(const section &) const;
160 
161  /// Allocate memory for and add the section.
162  void add_section(const section &s);
163 
164  void clear();
166  topic_list topics;
167  section_list sections;
168  int level;
169 };
170 
171 
172 /// To be used as a function object to locate sections and topics
173 /// with a specified ID.
174 class has_id
175 {
176 public:
177  has_id(const std::string &id) : id_(id) {}
178  bool operator()(const topic &t) { return t.id == id_; }
179  bool operator()(const section &s) { return s.id == id_; }
180  bool operator()(const section *s) { return s != nullptr && s->id == id_; }
181 private:
183 };
184 
185 /// To be used as a function object when sorting topic lists on the title.
187 {
188 public:
189  bool operator()(const topic &t1, const topic &t2) {
190  return strcoll(t1.title.c_str(), t2.title.c_str()) < 0; }
191 };
192 
193 /// To be used as a function object when sorting section lists on the title.
195 {
196 public:
197  bool operator()(const section* s1, const section* s2) {
198  return strcoll(s1->title.c_str(), s2->title.c_str()) < 0; }
199 };
200 
202 {
203 public:
204  bool operator() (const std::string &s1, const std::string &s2) const {
205  return strcoll(s1.c_str(), s2.c_str()) < 0;
206  }
207 };
208 
210 {
211  void operator()(section *s) { delete s; }
212 };
213 
215 {
216  section *operator()(const section *s) { return new section(*s); }
217  section *operator()(const section &s) { return new section(s); }
218 };
219 
220 /// Thrown when the help system fails to parse something.
221 struct parse_error : public game::error
222 {
223  parse_error(const std::string& msg) : game::error(msg) {}
224 };
225 
226 // Generator stuff below. Maybe move to a separate file? This one is
227 // getting crowded. Dunno if much more is needed though so I'll wait and
228 // see.
229 
230 /// Dispatch generators to their appropriate functions.
231 void generate_sections(const config *help_cfg, const std::string &generator, section &sec, int level);
232 std::vector<topic> generate_topics(const bool sort_topics,const std::string &generator);
234 const section &sec, const std::vector<topic>& generated_topics);
236 std::string generate_contents_links(const std::string& section_name, config const *help_cfg);
237 std::string generate_contents_links(const section &sec, const std::vector<topic>& topics);
238 
239 /// return a hyperlink with the unit's name and pointing to the unit page
240 /// return empty string if this unit is hidden. If not yet discovered add the (?) suffix
241 std::string make_unit_link(const std::string& type_id);
242 /// return a list of hyperlinks to unit's pages (ordered or not)
243 std::vector<std::string> make_unit_links_list(
244  const std::vector<std::string>& type_id_list, bool ordered = false);
245 
246 void generate_races_sections(const config *help_cfg, section &sec, int level);
247 void generate_terrain_sections(const config* help_cfg, section &sec, int level);
248 std::vector<topic> generate_unit_topics(const bool, const std::string& race);
249 void generate_unit_sections(const config *help_cfg, section &sec, int level, const bool, const std::string& race);
251 /// Return the type of description that should be shown for a unit of
252 /// the given kind. This method is intended to filter out information
253 /// about units that should not be shown, for example due to not being
254 /// encountered.
256 std::vector<topic> generate_ability_topics(const bool);
257 std::vector<topic> generate_time_of_day_topics(const bool);
258 std::vector<topic> generate_weapon_special_topics(const bool);
259 
260 void generate_era_sections(const config *help_cfg, section &sec, int level);
261 std::vector<topic> generate_faction_topics(const config &, const bool);
262 std::vector<topic> generate_era_topics(const bool, const std::string & era_id);
263 
264 /// Parse a help config, return the top level section. Return an empty
265 /// section if cfg is nullptr.
266 section parse_config(const config *cfg);
267 /// Recursive function used by parse_config.
268 void parse_config_internal(const config *help_cfg, const config *section_cfg,
269  section &sec, int level=0);
270 
271 /// Return true if the section with id section_id is referenced from
272 /// another section in the config, or the toplevel.
273 bool section_is_referenced(const std::string &section_id, const config &cfg);
274 /// Return true if the topic with id topic_id is referenced from
275 /// another section in the config, or the toplevel.
276 bool topic_is_referenced(const std::string &topic_id, const config &cfg);
277 
278 /// Search for the topic with the specified identifier in the section
279 /// and its subsections. Return the found topic, or nullptr if none could
280 /// be found.
281 const topic *find_topic(const section &sec, const std::string &id);
282 
283 /// Search for the section with the specified identifier in the section
284 /// and its subsections. Return the found section or nullptr if none could
285 /// be found.
286 const section *find_section(const section &sec, const std::string &id);
287 
288 /// Parse a text string. Return a vector with the different parts of the
289 /// text. Each markup item is a separate part while the text between
290 /// markups are separate parts.
291 std::vector<std::string> parse_text(const std::string &text);
292 
293 /// Convert the contents to wml attributes, surrounded within
294 /// [element_name]...[/element_name]. Return the resulting WML.
295 std::string convert_to_wml(const std::string &element_name, const std::string &contents);
296 
297 /// Return the color the string represents. Return font::NORMAL_COLOR if
298 /// the string is empty or can't be matched against any other color.
299 SDL_Color string_to_color(const std::string &s);
300 
301 /// Make a best effort to word wrap s. All parts are less than width.
302 std::vector<std::string> split_in_width(const std::string &s, const int font_size, const unsigned width);
303 
305 
306 /// Prepend all chars with meaning inside attributes with a backslash.
308 
309 /// Return the first word in s, not removing any spaces in the start of
310 /// it.
312 
313 /// Load the appropriate terrain types data to use
315 
316 extern const config *game_cfg;
317 // The default toplevel.
318 extern help::section toplevel;
319 // All sections and topics not referenced from the default toplevel.
321 
322 extern int last_num_encountered_units;
324 extern bool last_debug_state;
325 
326 extern std::vector<std::string> empty_string_vector;
327 extern const int max_section_level;
328 extern const int title_size;
329 extern const int title2_size;
330 extern const int box_width;
331 extern const int normal_font_size;
332 extern const unsigned max_history;
333 extern const std::string topic_img;
334 extern const std::string closed_section_img;
335 extern const std::string open_section_img;
336 // The topic to open by default when opening the help dialog.
337 extern const std::string default_show_topic;
338 extern const std::string unknown_unit_topic;
339 extern const std::string unit_prefix;
340 extern const std::string terrain_prefix;
341 extern const std::string race_prefix;
342 extern const std::string faction_prefix;
343 extern const std::string era_prefix;
344 extern const std::string variation_prefix;
345 
346 // id starting with '.' are hidden
347 std::string hidden_symbol(bool hidden = true);
348 
349 bool is_visible_id(const std::string &id);
350 
351 /// Return true if the id is valid for user defined topics and
352 /// sections. Some IDs are special, such as toplevel and may not be
353 /// be defined in the config.
354 bool is_valid_id(const std::string &id);
355 
356 /// Class to be used as a function object when generating the about
357 /// text. Translate the about dialog formatting to format suitable
358 /// for the help dialog.
360 public:
362  if (s.empty()) return s;
363  // Format + as headers, and the rest as normal text.
364  if (s[0] == '+')
365  return " \n<header>text='" + help::escape(s.substr(1)) + "'</header>";
366  if (s[0] == '-')
367  return s.substr(1);
368  return s;
369  }
370 };
371 
372 
373  // Helpers for making generation of topics easier.
374 
375 inline std::string make_link(const std::string& text, const std::string& dst)
376  {
377  // some sorting done on list of links may rely on the fact that text is first
378  return "<ref>text='" + help::escape(text) + "' dst='" + help::escape(dst) + "'</ref>";
379  }
380 
381 inline std::string jump_to(const unsigned pos)
382  {
383  std::stringstream ss;
384  ss << "<jump>to=" << pos << "</jump>";
385  return ss.str();
386  }
387 
388 inline std::string jump(const unsigned amount)
389  {
390  std::stringstream ss;
391  ss << "<jump>amount=" << amount << "</jump>";
392  return ss.str();
393  }
394 
396  {
397  std::stringstream ss;
398  ss << "<bold>text='" << help::escape(s) << "'</bold>";
399  return ss.str();
400  }
401 
402 typedef std::vector<std::vector<std::pair<std::string, unsigned int > > > table_spec;
403 // Create a table using the table specs. Return markup with jumps
404 // that create a table. The table spec contains a vector with
405 // vectors with pairs. The pairs are the markup string that should
406 // be in a cell, and the width of that cell.
407 std::string generate_table(const table_spec &tab, const unsigned int spacing=font::relative_size(20));
408 
409 // Return the width for the image with filename.
410 unsigned image_width(const std::string &filename);
411 
412 void push_tab_pair(std::vector<std::pair<std::string, unsigned int> > &v, const std::string &s);
413 
414 } // end namespace help
415 
416 #endif
std::string jump_to(const unsigned pos)
Definition: help_impl.hpp:381
section parse_config(const config *cfg)
Parse a help config, return the top level section.
Definition: help_impl.cpp:250
std::string id
Definition: help_impl.hpp:165
bool operator()(const std::string &s1, const std::string &s2) const
Definition: help_impl.hpp:204
std::string make_unit_link(const std::string &type_id)
return a hyperlink with the unit's name and pointing to the unit page return empty string if this uni...
Definition: help_impl.cpp:626
const std::string open_section_img
Definition: help_impl.cpp:84
const std::string unit_prefix
Definition: help_impl.cpp:88
std::vector< topic > generate_unit_topics(const bool sort_generated, const std::string &race)
Definition: help_impl.cpp:816
const std::string era_prefix
Definition: help_impl.cpp:92
void generate_unit_sections(const config *, section &sec, int level, const bool, const std::string &race)
Definition: help_impl.cpp:782
const std::string topic_img
Definition: help_impl.cpp:82
void push_tab_pair(std::vector< std::pair< std::string, unsigned int > > &v, const std::string &s)
Definition: help_impl.cpp:1389
const std::string race
const int title_size
Definition: help_impl.cpp:77
GLint level
Definition: glew.h:1220
bool operator==(const section &) const
Two sections are equal if their IDs are equal.
Definition: help_impl.cpp:1025
const std::vector< std::string > & parsed_text() const
Definition: help_impl.cpp:346
bool operator()(const section &s)
Definition: help_impl.hpp:179
const std::string closed_section_img
Definition: help_impl.cpp:83
int pos
Definition: formula.cpp:800
std::string remove_first_space(const std::string &text)
Definition: help_impl.cpp:1249
A section contains topics and sections along with title and ID.
Definition: help_impl.hpp:143
const std::string unknown_unit_topic
Definition: help_impl.cpp:87
const std::string race_prefix
Definition: help_impl.cpp:90
rng * generator
This generator is automatically synced during synced context.
Definition: random_new.cpp:52
std::string generate_topic_text(const std::string &generator, const config *help_cfg, const section &sec, const std::vector< topic > &generated_topics)
Definition: help_impl.cpp:306
GLuint GLuint GLsizei GLenum type
Definition: glew.h:1221
topic(const std::string &_title, const std::string &_id, const std::string &_text)
Definition: help_impl.hpp:127
int relative_size(int size)
Definition: font.hpp:72
help::section toplevel
Definition: help_impl.cpp:66
text_topic_generator(std::string const &t)
Definition: help_impl.hpp:75
Thrown when the help system fails to parse something.
Definition: help_impl.hpp:221
parse_error(const std::string &msg)
Definition: help_impl.hpp:223
std::vector< std::string > empty_string_vector
Definition: help_impl.cpp:75
const std::string id_
Definition: help_impl.hpp:182
topic_text(std::string const &t)
Definition: help_impl.hpp:93
bool operator<(const topic &) const
Comparison on the ID.
Definition: help_impl.cpp:992
std::vector< section * > section_list
Definition: help_impl.hpp:59
GLboolean GLboolean g
Definition: glew.h:7319
std::string operator()(const std::string &s)
Definition: help_impl.hpp:361
virtual std::string operator()() const
Definition: help_impl.hpp:76
const int normal_font_size
Definition: help_impl.cpp:80
topic_generator * generator_
Definition: help_impl.hpp:84
unsigned image_width(const std::string &filename)
Definition: help_impl.cpp:1379
const std::string terrain_prefix
Definition: help_impl.cpp:89
int last_num_encountered_terrains
Definition: help_impl.cpp:71
const config * game_cfg
Definition: help_impl.cpp:64
GLdouble GLdouble t
Definition: glew.h:1366
bool is_visible_id(const std::string &id)
Definition: help_impl.cpp:1351
std::string generate_about_text()
Definition: help_impl.cpp:916
std::vector< topic > generate_weapon_special_topics(const bool sort_generated)
Definition: help_impl.cpp:389
std::vector< std::string > make_unit_links_list(const std::vector< std::string > &type_id_list, bool ordered)
return a list of hyperlinks to unit's pages (ordered or not)
Definition: help_impl.cpp:652
std::string bold(const std::string &s)
Definition: help_impl.hpp:395
topic_text(topic_generator *g)
Definition: help_impl.hpp:99
section * operator()(const section &s)
Definition: help_impl.hpp:217
void generate_sections(const config *help_cfg, const std::string &generator, section &sec, int level)
Dispatch generators to their appropriate functions.
Definition: help_impl.cpp:287
help::section hidden_sections
Definition: help_impl.cpp:68
section_list sections
Definition: help_impl.hpp:167
const section * find_section(const section &sec, const std::string &id)
Search for the section with the specified identifier in the section and its subsections.
Definition: help_impl.cpp:1066
std::string id
Definition: help_impl.hpp:136
To be used as a function object to locate sections and topics with a specified ID.
Definition: help_impl.hpp:174
The text displayed in a topic.
Definition: help_impl.hpp:81
std::string generate_table(const table_spec &tab, const unsigned int spacing)
Definition: help_impl.cpp:1394
GLuint id
Definition: glew.h:1647
std::string hidden_symbol(bool hidden)
Definition: help_impl.cpp:1347
bool operator()(const topic &t1, const topic &t2)
Definition: help_impl.hpp:189
std::string title
Definition: help_impl.hpp:165
const GLdouble * v
Definition: glew.h:1359
std::vector< topic > generate_era_topics(const bool sort_generated, const std::string &era_id)
Definition: help_impl.cpp:514
GLenum GLenum dst
Definition: glew.h:2392
std::vector< std::vector< std::pair< std::string, unsigned int > > > table_spec
Definition: help_impl.hpp:402
UNIT_DESCRIPTION_TYPE
Definition: help_impl.hpp:250
void generate_terrain_sections(const config *, section &sec, int)
Definition: help_impl.cpp:730
std::vector< topic > generate_faction_topics(const config &era, const bool sort_generated)
Definition: help_impl.cpp:550
tdata_cache load_terrain_types_data()
Load the appropriate terrain types data to use.
Definition: help_impl.cpp:1443
std::vector< std::string > parsed_text_
Definition: help_impl.hpp:83
std::list< topic > topic_list
Definition: help_impl.hpp:140
bool operator()(const section *s1, const section *s2)
Definition: help_impl.hpp:197
const std::string &parameters float amount
Definition: filter.cpp:132
void parse_config_internal(const config *help_cfg, const config *section_cfg, section &sec, int level)
Recursive function used by parse_config.
Definition: help_impl.cpp:143
topic(const std::string &_title, const std::string &_id, topic_generator *g)
Definition: help_impl.hpp:129
const int box_width
Definition: help_impl.cpp:79
bool section_is_referenced(const std::string &section_id, const config &cfg)
Return true if the section with id section_id is referenced from another section in the config...
Definition: help_impl.cpp:95
bool topic_is_referenced(const std::string &topic_id, const config &cfg)
Return true if the topic with id topic_id is referenced from another section in the config...
Definition: help_impl.cpp:119
To be used as a function object when sorting section lists on the title.
Definition: help_impl.hpp:194
const std::string variation_prefix
Definition: help_impl.cpp:93
topic_text & operator=(topic_generator *g)
Definition: help_impl.cpp:338
bool operator!=(const topic &t) const
Definition: help_impl.hpp:133
int last_num_encountered_units
Definition: help_impl.cpp:70
bool operator()(const section *s)
Definition: help_impl.hpp:180
std::string make_link(const std::string &text, const std::string &dst)
Definition: help_impl.hpp:375
std::string convert_to_wml(const std::string &element_name, const std::string &contents)
Convert the contents to wml attributes, surrounded within [element_name]...[/element_name].
Definition: help_impl.cpp:1155
static void msg(const char *act, debug_info &i, const char *to="", const char *result="")
Definition: debugger.cpp:112
void generate_races_sections(const config *help_cfg, section &sec, int level)
Definition: help_impl.cpp:667
void operator()(section *s)
Definition: help_impl.hpp:211
std::string escape(const std::string &s)
Prepend all chars with meaning inside attributes with a backslash.
Definition: help_impl.cpp:1437
std::vector< std::string > parse_text(const std::string &text)
Parse a text string.
Definition: help_impl.cpp:1082
const unsigned max_history
Definition: help_impl.cpp:81
std::vector< topic > generate_time_of_day_topics(const bool)
Definition: help_impl.cpp:357
std::string generate_contents_links(const std::string &section_name, config const *help_cfg)
Definition: help_impl.cpp:927
const std::string faction_prefix
Definition: help_impl.cpp:91
std::string jump(const unsigned amount)
Definition: help_impl.hpp:388
has_id(const std::string &id)
Definition: help_impl.hpp:177
const std::string default_show_topic
Definition: help_impl.cpp:86
void generate_contents()
Generate the help contents from the configurations given to the manager.
Definition: help_impl.cpp:1283
Base class for all the errors encountered by the engine.
Definition: exceptions.hpp:27
std::vector< topic > generate_topics(const bool sort_generated, const std::string &generator)
Definition: help_impl.cpp:260
virtual std::string operator()() const =0
const topic * find_topic(const section &sec, const std::string &id)
Search for the topic with the specified identifier in the section and its subsections.
Definition: help_impl.cpp:1049
bool operator<(const section &) const
Comparison on the ID.
Definition: help_impl.cpp:1030
Generate a topic text on the fly.
Definition: help_impl.hpp:62
bool operator()(const topic &t)
Definition: help_impl.hpp:178
const int title2_size
Definition: help_impl.cpp:78
A topic contains a title, an id and some text.
Definition: help_impl.hpp:111
bool last_debug_state
Definition: help_impl.cpp:72
boost::shared_ptr< terrain_type_data > tdata_cache
Definition: help_impl.hpp:49
GLint GLint GLint GLint GLint GLint GLsizei width
Definition: glew.h:1220
Definition: help.cpp:57
Class to be used as a function object when generating the about text.
Definition: help_impl.hpp:359
SDL_Color string_to_color(const std::string &cmp_str)
Return the color the string represents.
Definition: help_impl.cpp:1206
virtual ~topic_generator()
Definition: help_impl.hpp:69
std::string title
Definition: help_impl.hpp:136
topic(const std::string &_title, const std::string &_id)
Definition: help_impl.hpp:120
bool is_valid_id(const std::string &id)
Return true if the id is valid for user defined topics and sections.
Definition: help_impl.cpp:1358
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:83
GLdouble s
Definition: glew.h:1358
std::string get_first_word(const std::string &s)
Return the first word in s, not removing any spaces in the start of it.
Definition: help_impl.cpp:1257
const int font_size
bool operator==(const topic &) const
Two topics are equal if their IDs are equal.
Definition: help_impl.cpp:987
void add_section(const section &s)
Allocate memory for and add the section.
Definition: help_impl.cpp:1035
UNIT_DESCRIPTION_TYPE description_type(const unit_type &type)
Return the type of description that should be shown for a unit of the given kind. ...
Definition: help_impl.cpp:902
std::vector< topic > generate_ability_topics(const bool sort_generated)
Definition: help_impl.cpp:449
void generate_era_sections(const config *help_cfg, section &sec, int level)
Definition: help_impl.cpp:707
GLsizei const GLcharARB ** string
Definition: glew.h:4503
const int max_section_level
Definition: help_impl.cpp:76
To be used as a function object when sorting topic lists on the title.
Definition: help_impl.hpp:186
std::vector< std::string > split_in_width(const std::string &s, const int font_size, const unsigned width)
Make a best effort to word wrap s. All parts are less than width.
Definition: help_impl.cpp:1230
topic_list topics
Definition: help_impl.hpp:166
topic_text text
Definition: help_impl.hpp:137
section * operator()(const section *s)
Definition: help_impl.hpp:216
section & operator=(const section &)
Definition: help_impl.cpp:1013