39 #ifndef OPENIMAGEIO_PARAMLIST_H
40 #define OPENIMAGEIO_PARAMLIST_H
45 # pragma warning (disable : 4251)
65 class OIIO_API ParamValue {
76 ParamValue () : m_type(TypeDesc::UNKNOWN), m_nvalues(0),
77 m_interp(INTERP_CONSTANT), m_copy(false), m_nonlocal(false)
81 ParamValue (
const ustring &_name, TypeDesc _type,
82 int _nvalues,
const void *_value,
bool _copy=
true) {
83 init_noclear (_name, _type, _nvalues, _value, _copy);
85 ParamValue (
const std::string &_name, TypeDesc _type,
86 int _nvalues,
const void *_value,
bool _copy=
true) {
87 init_noclear (
ustring(_name.c_str()), _type, _nvalues, _value, _copy);
89 ParamValue (
const char *_name, TypeDesc _type,
90 int _nvalues,
const void *_value,
bool _copy=
true) {
91 init_noclear (
ustring(_name), _type, _nvalues, _value, _copy);
93 ParamValue (
const ParamValue &p,
bool _copy=
true) {
94 init_noclear (p.name(), p.type(), p.nvalues(), p.data(), _copy);
96 ~ParamValue () { clear_value(); }
97 void init (
ustring _name, TypeDesc _type,
98 int _nvalues,
const void *_value,
bool _copy=
true) {
100 init_noclear (_name, _type, _nvalues, _value, _copy);
102 void init (std::string _name, TypeDesc _type,
103 int _nvalues,
const void *_value,
bool _copy=
true) {
104 init (
ustring(_name), _type, _nvalues, _value, _copy);
106 const ParamValue& operator= (
const ParamValue &p) {
107 init (p.name(), p.type(), p.nvalues(), p.data(), p.m_copy);
111 const ustring &name ()
const {
return m_name; }
112 TypeDesc type ()
const {
return m_type; }
113 int nvalues ()
const {
return m_nvalues; }
114 const void *data ()
const {
return m_nonlocal ? m_data.ptr : &m_data; }
115 int datasize ()
const {
return m_nvalues *
static_cast<int>(m_type.size()); }
117 friend void swap (ParamValue &a, ParamValue &b) {
118 std::swap (a.m_name, b.m_name);
119 std::swap (a.m_type, b.m_type);
120 std::swap (a.m_nvalues, b.m_nvalues);
121 std::swap (a.m_data.ptr, b.m_data.ptr);
122 std::swap (a.m_copy, b.m_copy);
123 std::swap (a.m_nonlocal, b.m_nonlocal);
134 unsigned char m_interp;
135 bool m_copy, m_nonlocal;
137 void init_noclear (
ustring _name, TypeDesc _type,
138 int _nvalues,
const void *_value,
bool _copy=
true);
147 typedef std::vector<ParamValue> Rep;
151 typedef Rep::iterator iterator;
152 typedef Rep::const_iterator const_iterator;
153 typedef ParamValue value_type;
154 typedef value_type & reference;
155 typedef const value_type & const_reference;
156 typedef value_type * pointer;
157 typedef const value_type * const_pointer;
159 iterator begin () {
return m_vals.begin(); }
160 iterator end () {
return m_vals.end(); }
161 const_iterator begin ()
const {
return m_vals.begin(); }
162 const_iterator end ()
const {
return m_vals.end(); }
164 reference front () {
return m_vals.front(); }
165 reference back () {
return m_vals.back(); }
166 const_reference front ()
const {
return m_vals.front(); }
167 const_reference back ()
const {
return m_vals.back(); }
169 reference operator[] (
int i) {
return m_vals[i]; }
170 const_reference operator[] (
int i)
const {
return m_vals[i]; }
171 reference operator[] (
size_t i) {
return m_vals[i]; }
172 const_reference operator[] (
size_t i)
const {
return m_vals[i]; }
174 void resize (
size_t newsize) { m_vals.resize (newsize); }
175 size_t size ()
const {
return m_vals.size(); }
186 void push_back (ParamValue &p) { m_vals.push_back (p); }
190 iterator
erase (iterator position) {
return m_vals.erase (position); }
194 iterator
erase (iterator first, iterator last) {
return m_vals.erase (first, last); }
202 void free () { Rep tmp; std::swap (m_vals, tmp); }