Skip to content

Commit 704618c

Browse files
committed
Merge remote-tracking branch 'kyle/fix-list-leak'
2 parents d7dd013 + 5d0e4b6 commit 704618c

2 files changed

Lines changed: 60 additions & 34 deletions

File tree

include/mapper/mapper_cpp.h

Lines changed: 55 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,52 @@ namespace mapper {
329329
mpr_time _time;
330330
};
331331

332+
template<class T>
333+
class ListIter {
334+
public:
335+
ListIter(mpr_list list) {
336+
_list = list;
337+
}
338+
339+
T operator*()
340+
{ return _list ? T(*_list) : T(NULL); }
341+
operator T()
342+
{ return _list ? T(*_list) : T(NULL); }
343+
344+
operator mpr_list() const {
345+
return _list;
346+
}
347+
348+
ListIter operator++(int) {
349+
if (_list != nullptr) {
350+
auto next = mpr_list_get_next(_list);
351+
if (next == nullptr) {
352+
mpr_list_free(_list);
353+
}
354+
return ListIter(next);
355+
} else {
356+
return ListIter((mpr_list)nullptr);
357+
}
358+
}
359+
360+
ListIter& operator++() {
361+
if (_list != nullptr) {
362+
auto next = mpr_list_get_next(_list);
363+
if (next == nullptr) {
364+
mpr_list_free(next);
365+
}
366+
_list = next;
367+
}
368+
return *this;
369+
}
370+
371+
bool operator==(const ListIter& rhs) const
372+
{ return (_list == rhs._list); }
373+
374+
private:
375+
mpr_list _list;
376+
};
377+
332378
/*! List objects provide a lazily-computed iterable list of results
333379
* from running queries against a mapper::Graph. */
334380
template <class T>
@@ -340,49 +386,30 @@ namespace mapper {
340386
using difference_type = int;
341387
using pointer = int*;
342388
using reference = int&;
389+
using iter = ListIter<T>;
343390

344391
/* Copy constructor */
345392
List(const List& orig)
346-
: List(mpr_list_get_cpy(orig._list)) {}
347-
348-
friend void swap(List& first, List& second)
349-
{
350-
using std::swap;
351-
swap(first._list, second._list);
352-
}
353-
354-
/* Copy assignment operator */
355-
List& operator=(List orig) noexcept
356-
{
357-
swap(*this, orig);
358-
return *this;
359-
}
393+
{ _list = mpr_list_get_cpy(orig._list); }
360394

361395
/* Move constructor */
362396
List(List&& orig) noexcept
363397
{ _list = orig._list; orig._list = NULL; }
364398

365-
/* Move assignment operator */
366-
List& operator=(List&& orig) noexcept
367-
{ std::swap(_list, orig._list); return *this; }
368-
369399
~List()
370-
{ mpr_list_free(_list); }
400+
{ if(_list == nullptr) {return;} mpr_list_free(_list); }
371401

372402
operator mpr_list() { return _list; }
373403

374404
bool operator==(const List& rhs)
375405
{ return (0 == mpr_list_cmp(_list, rhs._list)); }
376406
bool operator!=(const List& rhs)
377407
{ return (0 != mpr_list_cmp(_list, rhs._list)); }
378-
List& operator++()
379-
{ if (_list) _list = mpr_list_get_next(_list); RETURN_SELF; }
380-
List operator++(int)
381-
{ List tmp(*this); operator++(); return tmp; }
382-
List& begin()
383-
{ RETURN_SELF; }
384-
List end()
385-
{ return List(0); }
408+
409+
iter begin()
410+
{ return ListIter<T>(_list); }
411+
iter end()
412+
{ return ListIter<T>((mpr_list)nullptr); }
386413

387414
/*! Return the number of items in a List
388415
* \return The number of items in this list. */
@@ -1903,7 +1930,7 @@ namespace mapper {
19031930
std::string iface() const
19041931
{
19051932
const char *iface = mpr_graph_get_interface(_obj);
1906-
return iface ? std::string(iface) : std::string();
1933+
return std::string(iface);
19071934
}
19081935

19091936
/*! Specify the multicast group and port to use.

test/testcpp.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -372,9 +372,8 @@ int main(int argc, char ** argv)
372372
qsig.set_property("label", "foo");
373373

374374
out << "try printing all device signals:" << std::endl;
375-
qsig.begin();
376-
for (; qsig != qsig.end(); ++qsig) {
377-
out << " input: " << *qsig << ", label: " << (*qsig)["label"] << std::endl;
375+
for (Signal sig : qsig) {
376+
out << " input: " << sig << std::endl;
378377
}
379378

380379
Graph graph;
@@ -412,7 +411,7 @@ int main(int argc, char ** argv)
412411
// try retrieving linked devices
413412
out << "devices linked to " << dev << ":" << std::endl;
414413
List<Device> foo = dev[Property::LINKED];
415-
for (; foo != foo.end(); foo++) {
414+
for (Device dev : foo) {
416415
out << " " << *foo << std::endl;
417416
}
418417

@@ -421,8 +420,8 @@ int main(int argc, char ** argv)
421420
List<Device> qdev = graph.devices();
422421
qdev.filter(Property::NAME, "my*", Operator::EQUAL);
423422
qdev.filter(Property::NUM_SIGNALS_IN, 0, Operator::GREATER_THAN_OR_EQUAL);
424-
for (; qdev != qdev.end(); qdev++) {
425-
out << " " << *qdev << " (" << (*qdev)[Property::NUM_SIGNALS_IN] << " inputs)" << std::endl;
423+
for (Device dev : qdev) {
424+
out << " " << dev << " (" << (dev)[Property::NUM_SIGNALS_IN] << " inputs)" << std::endl;
426425
}
427426

428427
// check graph records

0 commit comments

Comments
 (0)