25 template <
class T=E
object>
28 static std::vector<T*> data;
30 T& operator[](std::size_t i) {
return *data[i];}
31 void register_type(
const T* t) {
32 if (t->type()+1>int(data.size()))
33 data.resize(t->type()+1);
35 data[t->type()]=
dynamic_cast<T*
>(t->clone());
42 template <
class T=E
object,
class TT=SimpleTypeTable<T> >
47 template <
class U,
class UU>
bool operator==(
const poly<U,UU>&)
const;
48 template <
class U,
class UU>
bool operator!=(
const poly<U,UU>&)
const;
49 void asg(
const poly& x) {
50 if (x) item=
dynamic_cast<T*
>(x->clone());
else item=NULL;
56 poly(
const T& x) {item=
dynamic_cast<T*
>(x.clone()); }
57 poly& operator=(
const poly& x) {
delete item; asg(x);
return *
this;}
58 poly& operator=(
const T& x) {
59 delete item; item=
dynamic_cast<T*
>(x.clone());
return *
this;}
60 ~
poly() {
delete item;}
69 delete item; item=
new U; TypeTable.register_type(item);
71 template <
class U,
class A>
poly addObject(A x) {
72 delete item; item=
new U(x); TypeTable.register_type(item);
74 template <
class U,
class A1,
class A2>
poly addObject(A1 x1, A2 x2) {
75 delete item; item=
new U(x1,x2); TypeTable.register_type(item);
78 T* operator->() {assert(item);
return item;}
79 T& operator*() {assert(item);
return *item;}
80 const T* operator->()
const {assert(item);
return item;}
81 const T& operator*()
const {assert(item);
return *item;}
84 template <
class U> U& cast() {
return dynamic_cast<U&
>(*item);}
86 template <
class U>
const U& cast()
const {
return dynamic_cast<U&
>(*item);}
89 void swap(
poly& x) {std::swap(item,x.item);}
91 bool operator==(
const poly& x)
const {
return x.item==item;}
92 bool operator!=(
const poly& x)
const {
return x.item!=item;};
93 operator bool()
const {
return item!=NULL;}
97 template <
class T=E
object,
class TT=SimpleTypeTable<T> >
101 poly<T,TT>& polyObj() {
return super::operator*();}
102 const poly<T,TT>& polyObj()
const {
return super::operator*();}
104 template <
class U>
bool operator==(
const U&)
const;
108 template <
class U>
polyref addObject() {
110 polyObj().template addObject<U>();
113 template <
class U,
class A>
polyref addObject(A x) {
114 polyObj().template addObject<U,A>(x);
116 template <
class U,
class A1,
class A2>
polyref addObject(A1 x1, A2 x2) {
117 polyObj().template addObject<U,A1,A2>(x1,x2);
121 T* operator->() {
return &*polyObj();}
122 T& operator*() {
return *polyObj();}
123 const T* operator->()
const {
return &*polyObj();}
124 const T& operator*()
const {
return *polyObj();}
126 bool operator==(
const polyref& x) {
127 return super::operator==(static_cast<super&>(x));
130 bool operator!=(
const U& x)
const {
return !operator==(x);}
133 template <
class U> U& cast() {
return polyObj().template cast<U>();}
135 template <
class U>
const U& cast()
const {
return polyObj().template cast<U>();}
137 operator bool ()
const {
return !super::nullref() && bool(polyObj());}
141 #pragma omit pack classdesc::poly 142 #pragma omit unpack classdesc::poly 143 #pragma omit isa classdesc::poly 144 #pragma omit pack classdesc::object 145 #pragma omit unpack classdesc::object 146 #pragma omit javaClass classdesc::object 147 #pragma omit pack classdesc::Object 148 #pragma omit unpack classdesc::Object 149 #pragma omit javaClass classdesc::Object 150 #pragma omit dump classdesc::SimpleTypeTable 151 #pragma omit dump classdesc::poly 152 #pragma omit javaClass classdesc::poly 158 template <
class T,
class TT>
173 template <
class T,
class TT>
179 bool valid; t>>valid;
182 typename T::TypeID
type;
184 if (!a || type!=a->type())
197 template <
class T>
void dump(dump_t&,
const string&,
const T&);
199 template <
class T,
class TT>
200 void dump(dump_t& t,
const string& d,
const poly<T,TT>& a) {}
Reference counted smart pointer classes.
class to allow access to private members
Definition: classdesc_access.h:21
poly addObject()
Target object initialisation.
Definition: poly.h:68
class to allow access to private members
Definition: classdesc_access.h:22
void dump(dump_t &o, const string &d, const T &a)
forward declare generic dump operation
Definition: dump_epilogue.h:55
Contains definitions related to classdesc functionality.
Definition: arrays.h:2514
Definition: pack_base.h:124
Contains access_* structs, and nothing else. These structs are used to gain access to private members...
Definition: accessor.h:55
virtual object ::TypeID type() const
Definition: object.h:80