annotate foosdk/sdk/foobar2000/SDK/cfg_var_legacy.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #ifdef FOOBAR2000_HAVE_CFG_VAR_LEGACY
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include <vector>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include "filesystem.h" // stream_reader, stream_writer
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 #if FOOBAR2000_SUPPORT_CFG_VAR_DOWNGRADE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 #include "configStore.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 #include "initquit.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 namespace cfg_var_legacy {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 #define CFG_VAR_ASSERT_SAFEINIT PFC_ASSERT(!core_api::are_services_available());/*imperfect check for nonstatic instantiation*/
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 //! Reader part of cfg_var object. In most cases, you should use cfg_var instead of using cfg_var_reader directly.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 class NOVTABLE cfg_var_reader {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 //! @param p_guid GUID of the variable, used to identify variable implementations owning specific configuration file entries when reading the configuration file back. You must generate a new GUID every time you declare a new cfg_var.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 cfg_var_reader(const GUID& guid) : m_guid(guid) { CFG_VAR_ASSERT_SAFEINIT; m_next = g_list; g_list = this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 ~cfg_var_reader() { CFG_VAR_ASSERT_SAFEINIT; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 //! Sets state of the variable. Called only from main thread, when reading configuration file.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 //! @param p_stream Stream containing new state of the variable.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 //! @param p_sizehint Number of bytes contained in the stream; reading past p_sizehint bytes will fail (EOF).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 virtual void set_data_raw(stream_reader* p_stream, t_size p_sizehint, abort_callback& p_abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 #if FOOBAR2000_SUPPORT_CFG_VAR_DOWNGRADE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 pfc::string8 m_downgrade_name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 pfc::string8 downgrade_name() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 void downgrade_set_name( const char * arg ) { m_downgrade_name = arg; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 //! Implementation of config downgrade for this var, see FOOBAR2000_SUPPORT_CFG_VAR_DOWNGRADE for more info. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 //! Most components should not use this.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 virtual void downgrade_check(fb2k::configStore::ptr api) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 //! Config downgrade main for your component, see FOOBAR2000_SUPPORT_CFG_VAR_DOWNGRADE for more info. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 //! Put FOOBAR2000_IMPLEMENT_CFG_VAR_DOWNGRADE somewhere in your component to call on startup, or call from your code as early as possible after config read. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 //! If you call it more than once, spurious calls will be ignored.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 static void downgrade_main();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 //! For internal use only, do not call.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 static void config_read_file(stream_reader* p_stream, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 const GUID m_guid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 static cfg_var_reader* g_list;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 cfg_var_reader* m_next;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 PFC_CLASS_NOT_COPYABLE_EX(cfg_var_reader)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 //! Writer part of cfg_var object. In most cases, you should use cfg_var instead of using cfg_var_writer directly.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 class NOVTABLE cfg_var_writer {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 //! @param p_guid GUID of the variable, used to identify variable implementations owning specific configuration file entries when reading the configuration file back. You must generate a new GUID every time you declare a new cfg_var.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 cfg_var_writer(const GUID& guid) : m_guid(guid) { CFG_VAR_ASSERT_SAFEINIT; m_next = g_list; g_list = this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 ~cfg_var_writer() { CFG_VAR_ASSERT_SAFEINIT; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 //! Retrieves state of the variable. Called only from main thread, when writing configuration file.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 //! @param p_stream Stream receiving state of the variable.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 virtual void get_data_raw(stream_writer* p_stream, abort_callback& p_abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 //! For internal use only, do not call.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 static void config_write_file(stream_writer* p_stream, abort_callback& p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 const GUID m_guid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 static cfg_var_writer* g_list;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 cfg_var_writer* m_next;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 PFC_CLASS_NOT_COPYABLE_EX(cfg_var_writer)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 //! Base class for configuration variable classes; provides self-registration mechaisms and methods to set/retrieve configuration data; those methods are automatically called for all registered instances by backend when configuration file is being read or written.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 //! Note that cfg_var class and its derivatives may be only instantiated statically (as static objects or members of other static objects), NEVER dynamically (operator new, local variables, members of objects instantiated as such).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 class NOVTABLE cfg_var : public cfg_var_reader, public cfg_var_writer {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 //! @param p_guid GUID of the variable, used to identify variable implementations owning specific configuration file entries when reading the configuration file back. You must generate a new GUID every time you declare a new cfg_var.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 cfg_var(const GUID& p_guid) : cfg_var_reader(p_guid), cfg_var_writer(p_guid) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 GUID get_guid() const { return cfg_var_reader::m_guid; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 #if FOOBAR2000_SUPPORT_CFG_VAR_DOWNGRADE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 int64_t downgrade_this( fb2k::configStore::ptr api, const char*, int64_t current);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 uint64_t downgrade_this( fb2k::configStore::ptr api, const char*, uint64_t current);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 int32_t downgrade_this( fb2k::configStore::ptr api, const char*, int32_t current);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 uint32_t downgrade_this( fb2k::configStore::ptr api, const char*, uint32_t current);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 bool downgrade_this( fb2k::configStore::ptr api, const char*, bool current);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 double downgrade_this( fb2k::configStore::ptr api, const char*, double current);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 GUID downgrade_this( fb2k::configStore::ptr api, const char*, GUID current);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 //! Generic integer config variable class. Template parameter can be used to specify integer type to use.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 //! Note that cfg_var class and its derivatives may be only instantiated statically (as static objects or members of other static objects), NEVER dynamically (operator new, local variables, members of objects instantiated as such).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 template<typename t_inttype>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 class cfg_int_t : public cfg_var {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 t_inttype m_val;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 void get_data_raw(stream_writer* p_stream, abort_callback& p_abort) override { p_stream->write_lendian_t(m_val, p_abort); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 void set_data_raw(stream_reader* p_stream, t_size, abort_callback& p_abort) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 t_inttype temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 p_stream->read_lendian_t(temp, p_abort);//alter member data only on success, this will throw an exception when something isn't right
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 m_val = temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 #if FOOBAR2000_SUPPORT_CFG_VAR_DOWNGRADE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 void downgrade_check(fb2k::configStore::ptr api) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 m_val = downgrade_this(api, this->downgrade_name(), m_val);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 //! @param p_guid GUID of the variable, used to identify variable implementations owning specific configuration file entries when reading the configuration file back. You must generate a new GUID every time you declare a new cfg_var.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 //! @param p_default Default value of the variable.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 explicit inline cfg_int_t(const GUID& p_guid, t_inttype p_default) : cfg_var(p_guid), m_val(p_default) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 inline const cfg_int_t<t_inttype>& operator=(const cfg_int_t<t_inttype>& p_val) { m_val = p_val.m_val; return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 inline t_inttype operator=(t_inttype p_val) { m_val = p_val; return m_val; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 inline operator t_inttype() const { return m_val; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 inline t_inttype get_value() const { return m_val; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 inline t_inttype get() const { return m_val; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 typedef cfg_int_t<t_int32> cfg_int;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 typedef cfg_int_t<t_uint32> cfg_uint;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 typedef cfg_int_t<GUID> cfg_guid; // ANNOYING OLD DESIGN. THIS DOESN'T BELONG HERE BUT CANNOT BE CHANGED WITHOUT BREAKING PEOPLE'S STUFF. BLARFGH.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 typedef cfg_int_t<bool> cfg_bool; // See above.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 typedef cfg_int_t<float> cfg_float; // See above %$!@#$
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 typedef cfg_int_t<double> cfg_double; // ....
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 //! String config variable. Stored in the stream with int32 header containing size in bytes, followed by non-null-terminated UTF-8 data.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 //! Note that cfg_var class and its derivatives may be only instantiated statically (as static objects or members of other static objects), NEVER dynamically (operator new, local variables, members of objects instantiated as such).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 class cfg_string : public cfg_var, public pfc::string8 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 void get_data_raw(stream_writer* p_stream, abort_callback& p_abort) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 void set_data_raw(stream_reader* p_stream, t_size p_sizehint, abort_callback& p_abort) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 #if FOOBAR2000_SUPPORT_CFG_VAR_DOWNGRADE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 void downgrade_check(fb2k::configStore::ptr) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 //! @param p_guid GUID of the variable, used to identify variable implementations owning specific configuration file entries when reading the configuration file back. You must generate a new GUID every time you declare a new cfg_var.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 //! @param p_defaultval Default/initial value of the variable.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 explicit inline cfg_string(const GUID& p_guid, const char* p_defaultval) : cfg_var(p_guid), pfc::string8(p_defaultval) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 const cfg_string& operator=(const cfg_string& p_val) { set_string(p_val); return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 const cfg_string& operator=(const char* p_val) { set_string(p_val); return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 const cfg_string& operator=(pfc::string8 && p_val) { set(std::move(p_val)); return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 inline operator const char* () const { return get_ptr(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 const pfc::string8& get() const { return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 void set( const char * arg ) { this->set_string(arg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 void set(pfc::string8&& arg) { pfc::string8 * pThis = this; *pThis = std::move(arg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 class cfg_string_mt : public cfg_var {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 void get_data_raw(stream_writer* p_stream, abort_callback& p_abort) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 pfc::string8 temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 get(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 p_stream->write_object(temp.get_ptr(), temp.length(), p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 void set_data_raw(stream_reader* p_stream, t_size, abort_callback& p_abort) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 pfc::string8_fastalloc temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 p_stream->read_string_raw(temp, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 set(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 #if FOOBAR2000_SUPPORT_CFG_VAR_DOWNGRADE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 void downgrade_check(fb2k::configStore::ptr) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 cfg_string_mt(const GUID& id, const char* defVal) : cfg_var(id), m_val(defVal) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 void get(pfc::string_base& out) const { inReadSync(m_sync); out = m_val; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 pfc::string8 get() const { inReadSync(m_sync); return m_val; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 void set(const char* val, t_size valLen = SIZE_MAX) { inWriteSync(m_sync); m_val.set_string(val, valLen); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 void set( pfc::string8 && val ) { inWriteSync(m_sync); m_val = std::move(val); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 mutable pfc::readWriteLock m_sync;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 pfc::string8 m_val;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 //! Struct config variable template. Warning: not endian safe, should be used only for nonportable code.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 //! Note that cfg_var class and its derivatives may be only instantiated statically (as static objects or members of other static objects), NEVER dynamically (operator new, local variables, members of objects instantiated as such).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 template<typename t_struct>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 class cfg_struct_t : public cfg_var {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 t_struct m_val = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 void get_data_raw(stream_writer* p_stream, abort_callback& p_abort) { p_stream->write_object(&m_val, sizeof(m_val), p_abort); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 void set_data_raw(stream_reader* p_stream, t_size p_sizehint, abort_callback& p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 t_struct temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 p_stream->read_object(&temp, sizeof(temp), p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 m_val = temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 //! @param p_guid GUID of the variable, used to identify variable implementations owning specific configuration file entries when reading the configuration file back. You must generate a new GUID every time you declare a new cfg_var.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 inline cfg_struct_t(const GUID& p_guid, const t_struct& p_val) : cfg_var(p_guid), m_val(p_val) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 //! @param p_guid GUID of the variable, used to identify variable implementations owning specific configuration file entries when reading the configuration file back. You must generate a new GUID every time you declare a new cfg_var.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 inline cfg_struct_t(const GUID& p_guid, int filler) : cfg_var(p_guid) { memset(&m_val, filler, sizeof(t_struct)); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 //! @param p_guid GUID of the variable, used to identify variable implementations owning specific configuration file entries when reading the configuration file back. You must generate a new GUID every time you declare a new cfg_var.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 inline cfg_struct_t(const GUID& p_guid) : cfg_var(p_guid) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 inline const cfg_struct_t<t_struct>& operator=(const cfg_struct_t<t_struct>& p_val) { m_val = p_val.get_value(); return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 inline const cfg_struct_t<t_struct>& operator=(const t_struct& p_val) { m_val = p_val; return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 inline const t_struct& get_value() const { return m_val; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 inline t_struct& get_value() { return m_val; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 inline operator t_struct() const { return m_val; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 void set(t_struct&& arg) { m_val = std::move(arg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 void set(t_struct const& arg) { m_val = arg; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 t_struct get() const { return m_val; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 template<typename TObj>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 class cfg_objList : public cfg_var, public pfc::list_t<TObj> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 typedef TObj item_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 typedef cfg_objList<item_t> t_self;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 cfg_objList(const GUID& guid) : cfg_var(guid) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 template<typename TSource, unsigned Count> cfg_objList(const GUID& guid, const TSource(&source)[Count]) : cfg_var(guid) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 reset(source);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 template<typename TSource, unsigned Count> void reset(const TSource(&source)[Count]) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 this->set_size(Count); for (t_size walk = 0; walk < Count; ++walk) (*this)[walk] = source[walk];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 void get_data_raw(stream_writer* p_stream, abort_callback& p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 stream_writer_formatter<> out(*p_stream, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 out << pfc::downcast_guarded<t_uint32>(this->get_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 for (t_size walk = 0; walk < this->get_size(); ++walk) out << (*this)[walk];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 void set_data_raw(stream_reader* p_stream, t_size p_sizehint, abort_callback& p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 stream_reader_formatter<> in(*p_stream, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 t_uint32 count; in >> count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 this->set_count(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 for (t_uint32 walk = 0; walk < count; ++walk) in >> (*this)[walk];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 } catch (...) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 this->remove_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 throw;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 template<typename t_in> t_self& operator=(t_in const& source) { this->remove_all(); this->add_items(source); return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 template<typename t_in> t_self& operator+=(t_in const& p_source) { this->add_item(p_source); return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 template<typename t_in> t_self& operator|=(t_in const& p_source) { this->add_items(p_source); return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 std::vector<item_t> get() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 std::vector<item_t> ret; ret.reserve(this->size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 for (auto& item : *this) ret.push_back(item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 template<typename arg_t> void set(arg_t&& arg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 this->remove_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 this->prealloc(std::size(arg));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 for (auto& item : arg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 this->add_item(item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 template<typename TList>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 class cfg_objListEx : public cfg_var, public TList {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 typedef cfg_objListEx<TList> t_self;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 cfg_objListEx(const GUID& guid) : cfg_var(guid) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 void get_data_raw(stream_writer* p_stream, abort_callback& p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 stream_writer_formatter<> out(*p_stream, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 out << pfc::downcast_guarded<t_uint32>(this->get_count());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 for (typename TList::const_iterator walk = this->first(); walk.is_valid(); ++walk) out << *walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 void set_data_raw(stream_reader* p_stream, t_size p_sizehint, abort_callback& p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 this->remove_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 stream_reader_formatter<> in(*p_stream, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 t_uint32 count; in >> count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 for (t_uint32 walk = 0; walk < count; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 typename TList::t_item item; in >> item; this->add_item(item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 template<typename t_in> t_self& operator=(t_in const& source) { this->remove_all(); this->add_items(source); return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 template<typename t_in> t_self& operator+=(t_in const& p_source) { this->add_item(p_source); return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 template<typename t_in> t_self& operator|=(t_in const& p_source) { this->add_items(p_source); return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 template<typename TObj>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 class cfg_obj : public cfg_var, public TObj {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 cfg_obj(const GUID& guid) : cfg_var(guid), TObj() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 template<typename TInitData> cfg_obj(const GUID& guid, const TInitData& initData) : cfg_var(guid), TObj(initData) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 TObj& val() { return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 TObj const& val() const { return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 TObj get() const { return val(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 template<typename arg_t> void set(arg_t&& arg) { val() = std::forward<arg_t>(arg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 void get_data_raw(stream_writer* p_stream, abort_callback& p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 stream_writer_formatter<> out(*p_stream, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 const TObj* ptr = this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 out << *ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 void set_data_raw(stream_reader* p_stream, t_size p_sizehint, abort_callback& p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 stream_reader_formatter<> in(*p_stream, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 TObj* ptr = this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 in >> *ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 template<typename TObj, typename TImport> class cfg_objListImporter : private cfg_var_reader {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 typedef cfg_objList<TObj> TMasterVar;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 cfg_objListImporter(TMasterVar& var, const GUID& guid) : m_var(var), cfg_var_reader(guid) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 void set_data_raw(stream_reader* p_stream, t_size p_sizehint, abort_callback& p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 TImport temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 stream_reader_formatter<> in(*p_stream, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 t_uint32 count; in >> count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 m_var.set_count(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 for (t_uint32 walk = 0; walk < count; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 in >> temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 m_var[walk] = temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 } catch (...) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 m_var.remove_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 throw;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 TMasterVar& m_var;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 template<typename TMap> class cfg_objMap : private cfg_var, public TMap {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 cfg_objMap(const GUID& id) : cfg_var(id) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 void get_data_raw(stream_writer* p_stream, abort_callback& p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 stream_writer_formatter<> out(*p_stream, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 out << pfc::downcast_guarded<t_uint32>(this->get_count());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 for (typename TMap::const_iterator walk = this->first(); walk.is_valid(); ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 out << walk->m_key << walk->m_value;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 void set_data_raw(stream_reader* p_stream, t_size p_sizehint, abort_callback& p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 this->remove_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 stream_reader_formatter<> in(*p_stream, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 t_uint32 count; in >> count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 for (t_uint32 walk = 0; walk < count; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 typename TMap::t_key key; in >> key; PFC_ASSERT(!this->have_item(key));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 try { in >> this->find_or_add(key); } catch (...) { this->remove(key); throw; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 #if FOOBAR2000_SUPPORT_CFG_VAR_DOWNGRADE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 #define FOOBAR2000_IMPLEMENT_CFG_VAR_DOWNGRADE FB2K_RUN_ON_INIT(cfg_var_reader::downgrade_main)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 #endif // FOOBAR2000_SUPPORT_CFG_VAR_DOWNGRADE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 } // cfg_var_legacy
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 namespace cfg_var_legacy {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 // Dummy class
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 class cfg_var_reader {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 cfg_var_reader(const GUID& id) : m_guid(id) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 const GUID m_guid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 #ifndef FOOBAR2000_IMPLEMENT_CFG_VAR_DOWNGRADE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 #define FOOBAR2000_IMPLEMENT_CFG_VAR_DOWNGRADE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 #endif