+MAJVER=1
+MINVER=0
+PATCHLEVEL=1
+
PACKAGENAME=flower
-VERSION=1.0
+VERSION=$(MAJVER).$(MINVER).$(PATCHLEVEL)
DNAME=$(PACKAGENAME)-$(VERSION)
CXXFLAGS+=-g -Wall
inl=findcurs.inl link.inl list.inl
hh=cursor.hh cursor.inl lgetopt.hh link.hh list.hh \
string.hh stringutil.hh vray.hh textdb.hh textstr.hh assoc.hh\
- findcurs.hh unionfind.hh compare.hh
+ findcurs.hh unionfind.hh compare.hh handle.hh
--- /dev/null
+#ifndef HANDLE_HH
+#define HANDLE_HH
+/// reference counting handle
+template<class T>
+class Handle {
+ T *obj;
+ int *refs;
+
+ /// let go of ref. Delete if necessary
+ void down() {
+ if (!(*refs--)) {
+ delete obj;
+ delete refs;
+ }
+ obj = 0;
+ refs = 0;
+ }
+ /// point to new object.
+ void up(T *t, int *r=0) {
+ if (!r) {
+ refs = new int;
+ *refs = 1;
+ } else {
+ refs =r;
+ *refs++;
+ }
+ obj = t;
+ }
+ /// POST: *refs == 1
+ void copy() {
+ if(*refs != 1){
+ T * newobj = new T(*obj );
+ down();
+ up(newobj);
+ }
+ }
+ Handle(Handle const &src) {
+ up(src.obj, src.refs);
+ }
+ Handle(T & o) {
+ up (&o);
+ }
+ void operator=(Handle const& src) {
+ if (this == &src)
+ return;
+ down();
+ up(src.o, src.refs);
+ }
+ operator const T&() {
+ return *obj;
+ }
+ operator T&() {
+ copy();
+ return *obj;
+ }
+}
+#endif