summaryrefslogtreecommitdiffstats
path: root/src/common/util
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2006-09-11 11:10:35 +0000
committerDavid Robillard <d@drobilla.net>2006-09-11 11:10:35 +0000
commitb15864870d34a1188eda93ad215734275037278e (patch)
tree224a1669a29091ea4198425d4a002e448cde8b30 /src/common/util
parent22bf43352ddfc48452d776f10ad4d12161255049 (diff)
downloadingen-b15864870d34a1188eda93ad215734275037278e.tar.gz
ingen-b15864870d34a1188eda93ad215734275037278e.tar.bz2
ingen-b15864870d34a1188eda93ad215734275037278e.zip
Switched homebrew CountedPtr to boost::shared_ptr.
Factories for patch windows, controller. Robustness updated in many places. Tons of cleanups, rewrites, bugfixes, etc. git-svn-id: http://svn.drobilla.net/lad/ingen@128 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/common/util')
-rw-r--r--src/common/util/CountedPtr.h53
-rw-r--r--src/common/util/Path.h19
2 files changed, 59 insertions, 13 deletions
diff --git a/src/common/util/CountedPtr.h b/src/common/util/CountedPtr.h
index c5eb2e50..e3f34ec2 100644
--- a/src/common/util/CountedPtr.h
+++ b/src/common/util/CountedPtr.h
@@ -21,6 +21,21 @@
#include <cassert>
#include <cstddef>
+// honestly, WTF?
+#include <boost/shared_ptr.hpp>
+
+#define CountedPtr boost::shared_ptr
+#define PtrCast boost::dynamic_pointer_cast
+#if 0
+// FIXME
+#ifndef NDEBUG
+#define COUNTED_PTR_DEBUG
+#include <iostream>
+#include <list>
+#include <algorithm>
+static std::list<void*> counted_ptr_counters;
+#endif
+
/** Simple reference counted pointer.
*
@@ -46,7 +61,7 @@ public:
/** Allocate a new Counter (if p is non-NULL) */
CountedPtr(T* p)
- : _counter(NULL)
+ : _counter(0)
{
if (p)
_counter = new Counter(p);
@@ -57,7 +72,7 @@ public:
* in STL containers :/
*/
CountedPtr()
- : _counter(NULL)
+ : _counter(0)
{}
~CountedPtr()
@@ -67,7 +82,7 @@ public:
/** Copy a CountedPtr with the same type. */
CountedPtr(const CountedPtr& copy)
- : _counter(NULL)
+ : _counter(0)
{
assert(this != &copy);
@@ -81,7 +96,7 @@ public:
*/
template <class Y>
CountedPtr(const CountedPtr<Y>& y)
- : _counter(NULL)
+ : _counter(0)
{
assert(this != (CountedPtr*)&y);
@@ -96,14 +111,14 @@ public:
}
}
- assert(_counter == NULL || _counter == (Counter*)y._counter);
+ assert( ! _counter || _counter == (Counter*)y._counter);
}
/** Assign to the value of a CountedPtr of the same type. */
CountedPtr& operator=(const CountedPtr& copy)
{
if (this != &copy) {
- assert(_counter == NULL || _counter != copy._counter);
+ assert( ! _counter || _counter != copy._counter);
release();
retain(copy._counter);
}
@@ -163,23 +178,42 @@ public:
private:
/** Stored on the heap and referred to by all existing CountedPtr's to
* the object */
- struct Counter
+ class Counter
{
+ public:
Counter(T* p)
: ptr(p)
, count(1)
{
assert(p);
+#ifdef COUNTED_PTR_DEBUG
+ assert(std::find(counted_ptr_counters.begin(), counted_ptr_counters.end(), (void*)p)
+ == counted_ptr_counters.end());
+ counted_ptr_counters.push_back(p);
+ std::cerr << "Creating " << typeid(T).name() << " Counter " << this << std::endl;
+#endif
}
+ ~Counter()
+ {
+ // for debugging
+ assert(count == 0);
+ count = 0;
+ }
+
T* const ptr;
volatile size_t count;
+
+ private:
+ // Prevent copies (undefined)
+ Counter(const Counter& copy);
+ Counter& operator=(const Counter& copy);
};
/** Increment the count */
void retain(Counter* c)
{
- assert(_counter == NULL || _counter == c);
+ assert( ! _counter || _counter == c);
_counter = c;
if (_counter)
++(c->count);
@@ -193,12 +227,13 @@ private:
delete _counter->ptr;
delete _counter;
}
- _counter = NULL;
+ _counter = 0;
}
}
Counter* _counter;
};
+#endif
#endif // COUNTED_PTR_H
diff --git a/src/common/util/Path.h b/src/common/util/Path.h
index c84607fb..6c6d54be 100644
--- a/src/common/util/Path.h
+++ b/src/common/util/Path.h
@@ -199,17 +199,28 @@ public:
/** Parent path with a "/" appended.
*
- * Because of the "/" special case, append a child name to base_path()
- * to construct a path. This return value followed by a valid name is
- * guaranteed to be a valid path.
+ * This exists to avoid needing to be careful about the special case of "/".
+ * To create a child of a path, use parent.base() + child_name.
+ * Returned value is always a valid path, with the single exception that
+ * the last character is "/".
*/
- inline string base_path() const
+ inline string base() const
{
if ((*this) == "/")
return *this;
else
return (*this) + "/";
}
+
+ inline bool is_child_of(const Path& parent) const
+ {
+ return (length() > parent.length() && substr(0, parent.length()) == parent);
+ }
+
+ inline bool is_parent_of(const Path& child) const
+ {
+ return child.is_child_of(*this);
+ }
};