Skip to content

Commit 66b7311

Browse files
Added an 'aliased' flag to struct member info
1 parent d9d03cc commit 66b7311

File tree

11 files changed

+264
-303
lines changed

11 files changed

+264
-303
lines changed

src/interface/shared/struct_dict.i

Lines changed: 26 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@
2121

2222
// Helper functions
2323
%fragment("struct_info_type", "header") {
24-
typedef std::vector< std::string > string_list;
2524
typedef struct {
26-
string_list members;
27-
string_list aliases;
25+
bool aliased = false;
26+
std::vector< std::string > members;
27+
std::vector< std::string > aliases;
2828
} struct_info;
2929
}
3030
%fragment("init_struct_info", "header", fragment="struct_info_type") {
@@ -40,8 +40,9 @@ static void init_struct_info(struct_info& info, swig_type_info* type) {
4040
std::string alias = getset->name;
4141
if (alias.back() == '_') {
4242
alias.pop_back();
43-
info.aliases.push_back(alias);
43+
info.aliased = true;
4444
}
45+
info.aliases.push_back(alias);
4546
}
4647
getset++;
4748
}
@@ -51,12 +52,10 @@ static void init_struct_info(struct_info& info, swig_type_info* type) {
5152
static PyObject* get_attr_struct(struct_info& info, bool as_item,
5253
PyObject* obj, PyObject* name) {
5354
std::string c_name = PyUnicode_AsUTF8(name);
54-
string_list list = info.aliases;
55-
if (as_item && list.empty())
56-
list = info.members;
57-
for (size_t i = 0; i < list.size(); i++)
58-
if (list[i] == c_name)
59-
return PyObject_GetAttrString(obj, info.members[i].c_str());
55+
if (as_item || info.aliased)
56+
for (size_t i = 0; i < info.members.size(); i++)
57+
if (info.aliases[i] == c_name)
58+
return PyObject_GetAttrString(obj, info.members[i].c_str());
6059
if (as_item)
6160
return PyErr_Format(PyExc_KeyError, "'%s'", c_name.c_str());
6261
return PyObject_GenericGetAttr(obj, name);
@@ -66,13 +65,11 @@ static PyObject* get_attr_struct(struct_info& info, bool as_item,
6665
static int set_attr_struct(struct_info& info, bool as_item,
6766
PyObject* obj, PyObject* name, PyObject* value) {
6867
std::string c_name = PyUnicode_AsUTF8(name);
69-
string_list list = info.aliases;
70-
if (as_item && list.empty())
71-
list = info.members;
72-
for (size_t i = 0; i < list.size(); i++)
73-
if (list[i] == c_name)
74-
return PyObject_SetAttrString(
75-
obj, info.members[i].c_str(), value);
68+
if (as_item || info.aliased)
69+
for (size_t i = 0; i < info.members.size(); i++)
70+
if (info.aliases[i] == c_name)
71+
return PyObject_SetAttrString(
72+
obj, info.members[i].c_str(), value);
7673
if (as_item) {
7774
PyErr_Format(PyExc_KeyError, "'%s'", c_name.c_str());
7875
return -1;
@@ -91,30 +88,28 @@ static int set_attr_struct(struct_info& info, bool as_item,
9188
}
9289
%fragment("keys_struct", "header", fragment="struct_info_type") {
9390
static PyObject* keys_struct(struct_info& info) {
94-
string_list list = info.aliases.empty() ? info.members : info.aliases;
95-
PyObject* result = PyTuple_New(list.size());
96-
for (size_t i = 0; i < list.size(); i++)
97-
PyTuple_SET_ITEM(result, i, PyUnicode_FromString(list[i].c_str()));
91+
PyObject* result = PyTuple_New(info.members.size());
92+
for (size_t i = 0; i < info.members.size(); i++)
93+
PyTuple_SET_ITEM(
94+
result, i, PyUnicode_FromString(info.aliases[i].c_str()));
9895
return result;
9996
};
10097
}
10198
%fragment("values_struct", "header", fragment="struct_info_type") {
10299
static PyObject* values_struct(struct_info& info, PyObject* obj) {
103-
string_list list = info.aliases.empty() ? info.members : info.aliases;
104-
PyObject* result = PyTuple_New(list.size());
105-
for (size_t i = 0; i < list.size(); i++)
100+
PyObject* result = PyTuple_New(info.members.size());
101+
for (size_t i = 0; i < info.members.size(); i++)
106102
PyTuple_SET_ITEM(
107103
result, i, PyObject_GetAttrString(obj, info.members[i].c_str()));
108104
return result;
109105
};
110106
}
111107
%fragment("items_struct", "header", fragment="struct_info_type") {
112108
static PyObject* items_struct(struct_info& info, PyObject* obj) {
113-
string_list list = info.aliases.empty() ? info.members : info.aliases;
114-
PyObject* result = PyTuple_New(list.size());
115-
for (size_t i = 0; i < list.size(); i++)
109+
PyObject* result = PyTuple_New(info.members.size());
110+
for (size_t i = 0; i < info.members.size(); i++)
116111
PyTuple_SET_ITEM(result, i, Py_BuildValue(
117-
"(sN)", list[i].c_str(),
112+
"(sN)", info.aliases[i].c_str(),
118113
PyObject_GetAttrString(obj, info.members[i].c_str())));
119114
return result;
120115
};
@@ -133,15 +128,15 @@ static PyObject* items_struct(struct_info& info, PyObject* obj) {
133128
%typemap(default) PyObject* value {$1 = NULL;}
134129
// Document functions
135130
%feature("docstring") struct_type::items "Get structure members.
136-
:rtype: list of (str, value) tuple
131+
:rtype: tuple of (str, value) tuple
137132
:return: structure member (name, value) pairs (with any trailing
138133
underscores removed from names)."
139134
%feature("docstring") struct_type::keys "Get structure member names.
140-
:rtype: list of str
135+
:rtype: tuple of str
141136
:return: structure member names (with any trailing underscores
142137
removed)."
143138
%feature("docstring") struct_type::values "Get structure member values.
144-
:rtype: list of value
139+
:rtype: tuple of value
145140
:return: structure member values."
146141
// Add functions
147142
%extend struct_type {

src/swig-0_27_7/datasets_wrap.cxx

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4353,10 +4353,10 @@ static void _set_python_exception() {
43534353
};
43544354

43554355

4356-
typedef std::vector< std::string > string_list;
43574356
typedef struct {
4358-
string_list members;
4359-
string_list aliases;
4357+
bool aliased = false;
4358+
std::vector< std::string > members;
4359+
std::vector< std::string > aliases;
43604360
} struct_info;
43614361

43624362

@@ -4372,8 +4372,9 @@ static void init_struct_info(struct_info& info, swig_type_info* type) {
43724372
std::string alias = getset->name;
43734373
if (alias.back() == '_') {
43744374
alias.pop_back();
4375-
info.aliases.push_back(alias);
4375+
info.aliased = true;
43764376
}
4377+
info.aliases.push_back(alias);
43774378
}
43784379
getset++;
43794380
}
@@ -4389,12 +4390,10 @@ static void init_info_Exiv2_DataSet() {
43894390
static PyObject* get_attr_struct(struct_info& info, bool as_item,
43904391
PyObject* obj, PyObject* name) {
43914392
std::string c_name = PyUnicode_AsUTF8(name);
4392-
string_list list = info.aliases;
4393-
if (as_item && list.empty())
4394-
list = info.members;
4395-
for (size_t i = 0; i < list.size(); i++)
4396-
if (list[i] == c_name)
4397-
return PyObject_GetAttrString(obj, info.members[i].c_str());
4393+
if (as_item || info.aliased)
4394+
for (size_t i = 0; i < info.members.size(); i++)
4395+
if (info.aliases[i] == c_name)
4396+
return PyObject_GetAttrString(obj, info.members[i].c_str());
43984397
if (as_item)
43994398
return PyErr_Format(PyExc_KeyError, "'%s'", c_name.c_str());
44004399
return PyObject_GenericGetAttr(obj, name);
@@ -4416,30 +4415,28 @@ static PyObject* get_attr_Exiv2_DataSet(PyObject* obj,
44164415

44174416

44184417
static PyObject* keys_struct(struct_info& info) {
4419-
string_list list = info.aliases.empty() ? info.members : info.aliases;
4420-
PyObject* result = PyTuple_New(list.size());
4421-
for (size_t i = 0; i < list.size(); i++)
4422-
PyTuple_SET_ITEM(result, i, PyUnicode_FromString(list[i].c_str()));
4418+
PyObject* result = PyTuple_New(info.members.size());
4419+
for (size_t i = 0; i < info.members.size(); i++)
4420+
PyTuple_SET_ITEM(
4421+
result, i, PyUnicode_FromString(info.aliases[i].c_str()));
44234422
return result;
44244423
};
44254424

44264425

44274426
static PyObject* values_struct(struct_info& info, PyObject* obj) {
4428-
string_list list = info.aliases.empty() ? info.members : info.aliases;
4429-
PyObject* result = PyTuple_New(list.size());
4430-
for (size_t i = 0; i < list.size(); i++)
4427+
PyObject* result = PyTuple_New(info.members.size());
4428+
for (size_t i = 0; i < info.members.size(); i++)
44314429
PyTuple_SET_ITEM(
44324430
result, i, PyObject_GetAttrString(obj, info.members[i].c_str()));
44334431
return result;
44344432
};
44354433

44364434

44374435
static PyObject* items_struct(struct_info& info, PyObject* obj) {
4438-
string_list list = info.aliases.empty() ? info.members : info.aliases;
4439-
PyObject* result = PyTuple_New(list.size());
4440-
for (size_t i = 0; i < list.size(); i++)
4436+
PyObject* result = PyTuple_New(info.members.size());
4437+
for (size_t i = 0; i < info.members.size(); i++)
44414438
PyTuple_SET_ITEM(result, i, Py_BuildValue(
4442-
"(sN)", list[i].c_str(),
4439+
"(sN)", info.aliases[i].c_str(),
44434440
PyObject_GetAttrString(obj, info.members[i].c_str())));
44444441
return result;
44454442
};
@@ -5854,18 +5851,18 @@ SwigPyBuiltin__Exiv2__DataSet_richcompare(PyObject *self, PyObject *other, int o
58545851
SWIGINTERN PyMethodDef SwigPyBuiltin__Exiv2__DataSet_methods[] = {
58555852
{ "keys", (PyCFunction)(void(*)(void))_wrap_DataSet_keys, METH_STATIC|METH_NOARGS, "\n"
58565853
"Get structure member names.\n"
5857-
":rtype: list of str\n"
5854+
":rtype: tuple of str\n"
58585855
":return: structure member names (with any trailing underscores\n"
58595856
" removed).\n"
58605857
"" },
58615858
{ "values", _wrap_DataSet_values, METH_NOARGS, "\n"
58625859
"Get structure member values.\n"
5863-
":rtype: list of value\n"
5860+
":rtype: tuple of value\n"
58645861
":return: structure member values.\n"
58655862
"" },
58665863
{ "items", _wrap_DataSet_items, METH_NOARGS, "\n"
58675864
"Get structure members.\n"
5868-
":rtype: list of (str, value) tuple\n"
5865+
":rtype: tuple of (str, value) tuple\n"
58695866
":return: structure member (name, value) pairs (with any trailing\n"
58705867
" underscores removed from names).\n"
58715868
"" },

src/swig-0_27_7/preview_wrap.cxx

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5432,10 +5432,10 @@ static int getbuffer_Exiv2_PreviewImage(
54325432
};
54335433

54345434

5435-
typedef std::vector< std::string > string_list;
54365435
typedef struct {
5437-
string_list members;
5438-
string_list aliases;
5436+
bool aliased = false;
5437+
std::vector< std::string > members;
5438+
std::vector< std::string > aliases;
54395439
} struct_info;
54405440

54415441

@@ -5451,8 +5451,9 @@ static void init_struct_info(struct_info& info, swig_type_info* type) {
54515451
std::string alias = getset->name;
54525452
if (alias.back() == '_') {
54535453
alias.pop_back();
5454-
info.aliases.push_back(alias);
5454+
info.aliased = true;
54555455
}
5456+
info.aliases.push_back(alias);
54565457
}
54575458
getset++;
54585459
}
@@ -5468,12 +5469,10 @@ static void init_info_Exiv2_PreviewProperties() {
54685469
static PyObject* get_attr_struct(struct_info& info, bool as_item,
54695470
PyObject* obj, PyObject* name) {
54705471
std::string c_name = PyUnicode_AsUTF8(name);
5471-
string_list list = info.aliases;
5472-
if (as_item && list.empty())
5473-
list = info.members;
5474-
for (size_t i = 0; i < list.size(); i++)
5475-
if (list[i] == c_name)
5476-
return PyObject_GetAttrString(obj, info.members[i].c_str());
5472+
if (as_item || info.aliased)
5473+
for (size_t i = 0; i < info.members.size(); i++)
5474+
if (info.aliases[i] == c_name)
5475+
return PyObject_GetAttrString(obj, info.members[i].c_str());
54775476
if (as_item)
54785477
return PyErr_Format(PyExc_KeyError, "'%s'", c_name.c_str());
54795478
return PyObject_GenericGetAttr(obj, name);
@@ -5495,30 +5494,28 @@ static PyObject* get_attr_Exiv2_PreviewProperties(PyObject* obj,
54955494

54965495

54975496
static PyObject* keys_struct(struct_info& info) {
5498-
string_list list = info.aliases.empty() ? info.members : info.aliases;
5499-
PyObject* result = PyTuple_New(list.size());
5500-
for (size_t i = 0; i < list.size(); i++)
5501-
PyTuple_SET_ITEM(result, i, PyUnicode_FromString(list[i].c_str()));
5497+
PyObject* result = PyTuple_New(info.members.size());
5498+
for (size_t i = 0; i < info.members.size(); i++)
5499+
PyTuple_SET_ITEM(
5500+
result, i, PyUnicode_FromString(info.aliases[i].c_str()));
55025501
return result;
55035502
};
55045503

55055504

55065505
static PyObject* values_struct(struct_info& info, PyObject* obj) {
5507-
string_list list = info.aliases.empty() ? info.members : info.aliases;
5508-
PyObject* result = PyTuple_New(list.size());
5509-
for (size_t i = 0; i < list.size(); i++)
5506+
PyObject* result = PyTuple_New(info.members.size());
5507+
for (size_t i = 0; i < info.members.size(); i++)
55105508
PyTuple_SET_ITEM(
55115509
result, i, PyObject_GetAttrString(obj, info.members[i].c_str()));
55125510
return result;
55135511
};
55145512

55155513

55165514
static PyObject* items_struct(struct_info& info, PyObject* obj) {
5517-
string_list list = info.aliases.empty() ? info.members : info.aliases;
5518-
PyObject* result = PyTuple_New(list.size());
5519-
for (size_t i = 0; i < list.size(); i++)
5515+
PyObject* result = PyTuple_New(info.members.size());
5516+
for (size_t i = 0; i < info.members.size(); i++)
55205517
PyTuple_SET_ITEM(result, i, Py_BuildValue(
5521-
"(sN)", list[i].c_str(),
5518+
"(sN)", info.aliases[i].c_str(),
55225519
PyObject_GetAttrString(obj, info.members[i].c_str())));
55235520
return result;
55245521
};
@@ -6809,18 +6806,18 @@ SwigPyBuiltin__Exiv2__PreviewProperties_richcompare(PyObject *self, PyObject *ot
68096806
SWIGINTERN PyMethodDef SwigPyBuiltin__Exiv2__PreviewProperties_methods[] = {
68106807
{ "keys", (PyCFunction)(void(*)(void))_wrap_PreviewProperties_keys, METH_STATIC|METH_NOARGS, "\n"
68116808
"Get structure member names.\n"
6812-
":rtype: list of str\n"
6809+
":rtype: tuple of str\n"
68136810
":return: structure member names (with any trailing underscores\n"
68146811
" removed).\n"
68156812
"" },
68166813
{ "values", _wrap_PreviewProperties_values, METH_NOARGS, "\n"
68176814
"Get structure member values.\n"
6818-
":rtype: list of value\n"
6815+
":rtype: tuple of value\n"
68196816
":return: structure member values.\n"
68206817
"" },
68216818
{ "items", _wrap_PreviewProperties_items, METH_NOARGS, "\n"
68226819
"Get structure members.\n"
6823-
":rtype: list of (str, value) tuple\n"
6820+
":rtype: tuple of (str, value) tuple\n"
68246821
":return: structure member (name, value) pairs (with any trailing\n"
68256822
" underscores removed from names).\n"
68266823
"" },

0 commit comments

Comments
 (0)