summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.old-deja/g++.benjamin/tem01.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.old-deja/g++.benjamin/tem01.C')
-rw-r--r--gcc/testsuite/g++.old-deja/g++.benjamin/tem01.C136
1 files changed, 136 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.old-deja/g++.benjamin/tem01.C b/gcc/testsuite/g++.old-deja/g++.benjamin/tem01.C
new file mode 100644
index 000000000..76c90c4a8
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.benjamin/tem01.C
@@ -0,0 +1,136 @@
+// { dg-do assemble }
+// prms-id: 13911
+
+template<unsigned int N>
+class ref_counter {
+public:
+ ref_counter() : p_refcnt(new unsigned int(N)) {}
+ ref_counter(const ref_counter<N>& x) : p_refcnt(x.p_refcnt) {
+ ++*p_refcnt;
+ }
+ ref_counter& operator=(const ref_counter<N>& rhs) {
+ ++*rhs.p_refcnt;
+ decrement();
+ p_refcnt = rhs.p_refcnt;
+ return *this;
+ }
+ ~ref_counter() {decrement();}
+
+ bool unique() const {return *p_refcnt == N;}
+
+private:
+ unsigned int* p_refcnt;
+ void decrement() {
+ if (unique()) delete p_refcnt;
+ else --*p_refcnt;
+ }
+};
+
+template<class T, unsigned int N>
+class ref_pointer {
+public:
+
+ ref_pointer() : the_p(0) {}
+ ref_pointer(T* just_newed) : the_p(just_newed) {}
+ virtual ~ref_pointer() {if (unique()) delete the_p;}
+protected:
+ ref_pointer(T* the_p_arg, ref_counter<N>& ref_count_arg)
+ : the_p(the_p_arg), ref_count(ref_count_arg) {}
+
+public:
+
+ ref_pointer& operator=(const ref_pointer&);
+ ref_pointer& operator=(T*);
+ operator const T*() const {return the_p;}
+ T* operator()() {return the_p;}
+ T* operator()() const {return the_p;}
+ T& operator*() const {return *the_p;}
+ friend bool operator==(const ref_pointer<T, N>& lhs,
+ const ref_pointer<T, N>& rhs) {
+ return lhs.the_p == rhs.the_p;
+ }
+ friend bool operator!=(const ref_pointer<T, N>& lhs,
+ const ref_pointer<T, N>& rhs) {
+ return lhs.the_p != rhs.the_p;
+ }
+
+
+ bool unique() const {return ref_count.unique();}
+ bool isNull() const {return the_p==0;}
+
+protected:
+ ref_counter<N>& refCount() {return ref_count;}
+
+private:
+
+ ref_counter<N> ref_count;
+ T* the_p;
+};
+
+template<class T, unsigned int N>
+ref_pointer<T, N>& ref_pointer<T, N>::operator=(const ref_pointer<T, N>& rhs) {
+ if (the_p != rhs.the_p) {
+ if (unique()) delete the_p;
+ the_p = rhs.the_p;
+ ref_count = rhs.ref_count;
+ }
+ return *this;
+}
+
+
+template<class T, unsigned int N>
+ref_pointer<T, N>& ref_pointer<T, N>::operator=(T* just_newed) {
+ if (unique()) delete the_p;
+ the_p = just_newed;
+ ref_count = ref_counter<N>();
+ return *this;
+}
+
+
+
+template<class T>
+class CountedObjPtr : public ref_pointer<T, 1> {
+public:
+ CountedObjPtr() {}
+ CountedObjPtr(T* just_newed) : ref_pointer<T, 1>(just_newed) {}
+ CountedObjPtr(T* the_p_arg, ref_counter<1>& ref_count_arg)
+ : ref_pointer<T, 1>(the_p_arg, ref_count_arg) {}
+ CountedObjPtr<T>& operator=(T* rhs) {
+ ref_pointer<T, 1>::operator=(rhs);
+ return *this;
+ }
+ CountedObjPtr<T>& operator=(const CountedObjPtr<T>& rhs) {
+ ref_pointer<T, 1>::operator=(rhs);
+ return *this;
+ }
+ T* operator->() const {return (*this)();}
+
+};
+
+
+
+
+
+//instantiating type
+
+class TSObservable;
+
+class TSObserver {
+public:
+
+ enum TSType { NormalTS, UpYldCrvTS, DownYldCrvTS, ZeroVolTS };
+
+ virtual ~TSObserver() {}
+
+ virtual void update(TSObservable* theChangedObservable) = 0;
+ virtual TSType key() const { return myKey; }
+ virtual TSType& key() { return myKey; }
+protected:
+ TSObserver(TSType myKeyArg) : myKey(myKeyArg) {}
+ TSType myKey;
+};
+
+
+
+//now try to instantiate
+template class CountedObjPtr<TSObserver>;