summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.old-deja/g++.benjamin/tem01.C
diff options
context:
space:
mode:
authorupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
committerupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
commit554fd8c5195424bdbcabf5de30fdc183aba391bd (patch)
tree976dc5ab7fddf506dadce60ae936f43f58787092 /gcc/testsuite/g++.old-deja/g++.benjamin/tem01.C
downloadcbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.bz2
cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.xz
obtained gcc-4.6.4.tar.bz2 from upstream website;upstream
verified gcc-4.6.4.tar.bz2.sig; imported gcc-4.6.4 source tree from verified upstream tarball. downloading a git-generated archive based on the 'upstream' tag should provide you with a source tree that is binary identical to the one extracted from the above tarball. if you have obtained the source via the command 'git clone', however, do note that line-endings of files in your working directory might differ from line-endings of the respective files in the upstream repository.
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>;