9#ifndef CLASSDESC_POLY_H
10#define CLASSDESC_POLY_H
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());
39 template <
class T> std::vector<T*> SimpleTypeTable<T>::data;
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;
55 poly(
const poly& x) {asg(x);}
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);
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;}
85 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> >
100 typedef ref<poly<T,TT> > super;
104 template <
class U>
bool operator==(
const U&)
const;
116 template <
class U,
class A1,
class A2> polyref
addObject(A1 x1, A2 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);}
134 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) {}
209 template <
class T,
class TT>
void swap(classdesc::poly<T,TT>& x,classdesc::poly<T,TT>& y) {x.swap(y);}
Definition pack_base.h:138
poly addObject()
Target object initialisation.
Definition poly.h:68
U & cast()
cast target to type U. Thows std::bad_cast if impossible.
Definition poly.h:85
U & cast()
cast target to type U. Throws if not possible
Definition poly.h:134
polyref addObject()
add object of type U
Definition poly.h:109
T & operator*()
Definition ref.h:65
bool nullref() const
Definition ref.h:73
Contains access_* structs, and nothing else. These structs are used to gain access to private members...
Definition classdesc_access.h:20
Contains definitions related to classdesc functionality.
void dump(dump_t &o, const string &d, const T &a)
forward declare generic dump operation
Definition dump_epilogue.h:55
Reference counted smart pointer classes.
class to allow access to private members
Definition classdesc_access.h:21
class to allow access to private members
Definition classdesc_access.h:22