The Battle for Wesnoth  1.15.1+dev
variable_info.hpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2003 by David White <dave@whitevine.net>
3  Copyright (C) 2005 - 2018 by Philippe Plantier <ayin@anathas.org>
4 
5  Part of the Battle for Wesnoth Project https://www.wesnoth.org/
6 
7  This program is free software; you can redistribute it and/or modify
8  it under the terms of the GNU General Public License as published by
9  the Free Software Foundation; either version 2 of the License, or
10  (at your option) any later version.
11  This program is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY.
13 
14  See the COPYING file for more details.
15 */
16 
17 #pragma once
18 
19 #include "config.hpp"
20 
21 #include <string>
22 #include <type_traits>
23 
24 class invalid_variablename_exception : public std::exception
25 {
26 public:
27  invalid_variablename_exception() : std::exception() {}
28 
29  const char* what() const noexcept
30  {
31  return "invalid_variablename_exception";
32  }
33 };
34 
35 // NOTE: the detail file needs invalid_variablename_exception to be available,
36 // so include this after declaring it.
37 #include "variable_info_detail.hpp"
38 
39 /** Information on a WML variable. */
40 template<typename V>
42 {
43 public:
44  variable_info(const std::string& varname, maybe_const_t<config, V>& vars) noexcept;
45 
46  std::string get_error_message() const;
47 
48  bool explicit_index() const;
49 
50  /** @throws invalid_variablename_exception */
51  bool exists_as_attribute() const;
52 
53  /** @throws invalid_variablename_exception */
54  bool exists_as_container() const;
55 
56  /**
57  * If instantiated with vi_policy_const, the lifetime of the returned
58  * const attribute_value reference might end with the lifetime of this object.
59  *
60  * @throws invalid_variablename_exception
61  */
63 
64  /**
65  * If instantiated with vi_policy_const, the lifetime of the returned
66  * const attribute_value reference might end with the lifetime of this object.
67  *
68  * @throws invalid_variablename_exception
69  */
70  maybe_const_t<config, V>& as_container() const;
71 
72  /**
73  * If instantiated with vi_policy_const, the lifetime of the returned
74  * const attribute_value reference might end with the lifetime of this object.
75  *
76  * Range may be empty
77  * @throws invalid_variablename_exception
78  */
80 
81 protected:
82  std::string name_;
84  bool valid_;
85 
86  void throw_on_invalid() const;
87  void calculate_value();
88 };
89 
90 /**
91  * Additional functionality for a non-const variable_info.
92  * @todo: should these functions take a reference?
93  */
94 template<typename V>
96 {
97 public:
98  variable_info_mutable(const std::string& name, config& game_vars)
99  : variable_info<V>(name, game_vars)
100  {
101  static_assert(!std::is_same<
102  variable_info_implementation::vi_policy_const, std::remove_const_t<V>>::value,
103  "variable_info_mutable cannot be specialized with 'vi_policy_const'"
104  );
105  }
106 
107  /**
108  * @returns The new appended range.
109  * @throws invalid_variablename_exception
110  */
111  config::child_itors append_array(std::vector<config> children) const;
112 
113  /**
114  * @returns The new inserted range.
115  * @throws invalid_variablename_exception
116  */
117  config::child_itors insert_array(std::vector<config> children) const;
118 
119  /**
120  * @returns The new range.
121  * @throws invalid_variablename_exception
122  */
123  config::child_itors replace_array(std::vector<config> children) const;
124 
125  /**
126  * @throws invalid_variablename_exception
127  */
128  void merge_array(std::vector<config> children) const;
129 
130  /**
131  * Clears the value this object points to.
132  *
133  * @param only_tables If true, will not clear attribute values.
134  * @throws invalid_variablename_exception
135  */
136  void clear(bool only_tables = false) const;
137 };
138 
139 /** 'Create if nonexistent' access. */
141 
142 /** 'Throw if nonexistent' access. */
144 
145 /**
146  * Read-only access.
147  *
148  * NOTE: in order to easily mark certain types in this specialization as const we specify
149  * the policy as const here. This allows the use of const_clone.
150  */
variable_info_mutable(const std::string &name, config &game_vars)
typename variable_info_implementation::maybe_const< T, V >::type maybe_const_t
Helper template alias for maybe_const, defined at global scope for convenience.
void clear(const std::string &key)
Definition: general.cpp:205
STL namespace.
Additional functionality for a non-const variable_info.
Definitions for the interface to Wesnoth Markup Language (WML).
static const char * name(const std::vector< SDL_Joystick *> &joysticks, const std::size_t index)
Definition: joystick.cpp:48
const char * what() const noexcept
variable_info_implementation::variable_info_state< V > state_
std::string name_
Information on a WML variable.
boost::iterator_range< child_iterator > child_itors
Definition: config.hpp:237
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:92