00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 #ifndef COH_LANG_SPEC_HPP
00017 #define COH_LANG_SPEC_HPP
00018 
00019 #include "coherence/lang/compatibility.hpp"
00020 
00021 #include "coherence/lang/TypedHandle.hpp"
00022 #include "coherence/lang/TypedHolder.hpp"
00023 
00024 COH_OPEN_NAMESPACE2(coherence,lang)
00025 
00026 class Object;
00027 
00028 
00029 
00030 
00031 
00032 
00033 template<class T = void> class COH_EXPORT_SPEC Void
00034     {
00035     protected:
00036         virtual ~Void()
00037             {}
00038 
00039     public:
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052         virtual void* _cast(coh_class_id ) const
00053             {
00054             return NULL;
00055             }
00056 
00057 
00058 
00059 
00060         virtual size64_t sizeOf(bool  = false) const
00061             {
00062             return 0;
00063             }
00064     };
00065 
00066 
00067 
00068 
00069 
00070 
00071 template<class T> class Alias
00072     {
00073     public:
00074         typedef typename T::alias alias;
00075     };
00076 
00077 
00078 
00079 
00080 
00081 
00082 template<> class Alias<Void<> >
00083     {
00084     public:
00085         typedef Void<> alias;
00086     };
00087 
00088 
00089 
00090 
00091 
00092 
00093 template<> class Alias<Object>
00094     {
00095     public:
00096         typedef Void<Object> alias;
00097     };
00098 
00099 
00100 
00101 
00102 
00103 
00104 
00105 
00106 
00107 
00108 
00109 template<class I, class N> class COH_EXPORT_SPEC interface_link
00110     : public virtual I, public virtual N
00111     {
00112     public:
00113 
00114 
00115 
00116 
00117 
00118 
00119 
00120 
00121 
00122 
00123 
00124 
00125 
00126 
00127         inline void* _icast(coh_class_id pInfo) const
00128             {
00129             
00130             
00131             
00132             
00133             void* p = COH_CLASS_ID(I) == pInfo
00134                     ? (void*) static_cast<const I*>(this)
00135                     : N::_icast(pInfo);
00136             return p ? p : I::_icast(pInfo);
00137             }
00138     };
00139 
00140 
00141 
00142 
00143 
00144 
00145 template<class I> class COH_EXPORT_SPEC interface_link<void, I>
00146     {
00147     public:
00148     inline void* _icast(coh_class_id ) const
00149         {
00150         return NULL;
00151         }
00152     };
00153 
00154 
00155 
00156 
00157 
00158 
00159 
00160 
00161 
00162 
00163 
00164 
00165 
00166 
00167 
00168 
00169 
00170 
00171 
00172 
00173 
00174 template<class I1  = void,
00175          class I2  = void,
00176          class I3  = void,
00177          class I4  = void,
00178          class I5  = void,
00179          class I6  = void,
00180          class I7  = void,
00181          class I8  = void,
00182          class I9  = void,
00183          class I10 = void,
00184          class I11 = void,
00185          class I12 = void,
00186          class I13 = void,
00187          class I14 = void,
00188          class I15 = void,
00189          class I16 = void>
00190 class COH_EXPORT_SPEC implements
00191     {
00192     public:
00193         typedef interface_link<I1,
00194                 interface_link<I2,
00195                 interface_link<I3,
00196                 interface_link<I4,
00197                 interface_link<I5,
00198                 interface_link<I6,
00199                 interface_link<I7,
00200                 interface_link<I8,
00201                 interface_link<I9,
00202                 interface_link<I10,
00203                 interface_link<I11,
00204                 interface_link<I12,
00205                 interface_link<I13,
00206                 interface_link<I14,
00207                 interface_link<I15,
00208                 interface_link<I16,
00209                 void > > > > > > > > > > > > > > > >
00210         implements_chain;
00211 
00212         typedef I1  interface_1;
00213         typedef I2  interface_2;
00214         typedef I3  interface_3;
00215         typedef I4  interface_4;
00216         typedef I5  interface_5;
00217         typedef I6  interface_6;
00218         typedef I7  interface_7;
00219         typedef I8  interface_8;
00220         typedef I9  interface_9;
00221         typedef I10 interface_10;
00222         typedef I11 interface_11;
00223         typedef I12 interface_12;
00224         typedef I13 interface_13;
00225         typedef I14 interface_14;
00226         typedef I15 interface_15;
00227         typedef I16 interface_16;
00228     };
00229 
00230 
00231 
00232 
00233 
00234 
00235 
00236 
00237 
00238 
00239 
00240 template<class P = Void<>, class A = typename Alias<P>::alias >
00241 class COH_EXPORT_SPEC extends
00242     {
00243     public:
00244 
00245 
00246 
00247         typedef P inherited;
00248 
00249 
00250 
00251 
00252         typedef P inherited_literal;
00253 
00254 
00255 
00256 
00257 
00258 
00259         typedef typename P::super grand;
00260 
00261 
00262 
00263 
00264         typedef A alias;
00265     };
00266 
00267 
00268 
00269 
00270 
00271 
00272 template<> class COH_EXPORT_SPEC extends<Void<>, Void<> >
00273     {
00274     public:
00275         typedef Void<> inherited;
00276         typedef Void<> inherited_literal;
00277         typedef Void<> alias;
00278     };
00279 
00280 
00281 
00282 
00283 
00284 
00285 
00286 #define COH_LIST1(A)                 A##1
00287 #define COH_LIST2(A)  COH_LIST1 (A), A##2
00288 #define COH_LIST3(A)  COH_LIST2 (A), A##3
00289 #define COH_LIST4(A)  COH_LIST3 (A), A##4
00290 #define COH_LIST5(A)  COH_LIST4 (A), A##5
00291 #define COH_LIST6(A)  COH_LIST5 (A), A##6
00292 #define COH_LIST7(A)  COH_LIST6 (A), A##7
00293 #define COH_LIST8(A)  COH_LIST7 (A), A##8
00294 #define COH_LIST9(A)  COH_LIST8 (A), A##9
00295 #define COH_LIST10(A) COH_LIST9 (A), A##10
00296 #define COH_LIST11(A) COH_LIST10(A), A##11
00297 #define COH_LIST12(A) COH_LIST11(A), A##12
00298 #define COH_LIST13(A) COH_LIST12(A), A##13
00299 #define COH_LIST14(A) COH_LIST13(A), A##14
00300 #define COH_LIST15(A) COH_LIST14(A), A##15
00301 #define COH_LIST16(A) COH_LIST15(A), A##16
00302 
00303 
00304 
00305 
00306 
00307 
00308 #define COH_ARG_LIST1(A)                     A##1&  a1
00309 #define COH_ARG_LIST2(A)  COH_ARG_LIST1 (A), A##2&  a2
00310 #define COH_ARG_LIST3(A)  COH_ARG_LIST2 (A), A##3&  a3
00311 #define COH_ARG_LIST4(A)  COH_ARG_LIST3 (A), A##4&  a4
00312 #define COH_ARG_LIST5(A)  COH_ARG_LIST4 (A), A##5&  a5
00313 #define COH_ARG_LIST6(A)  COH_ARG_LIST5 (A), A##6&  a6
00314 #define COH_ARG_LIST7(A)  COH_ARG_LIST6 (A), A##7&  a7
00315 #define COH_ARG_LIST8(A)  COH_ARG_LIST7 (A), A##8&  a8
00316 #define COH_ARG_LIST9(A)  COH_ARG_LIST8 (A), A##9&  a9
00317 #define COH_ARG_LIST10(A) COH_ARG_LIST9 (A), A##10& a10
00318 #define COH_ARG_LIST11(A) COH_ARG_LIST10(A), A##11& a11
00319 #define COH_ARG_LIST12(A) COH_ARG_LIST11(A), A##12& a12
00320 #define COH_ARG_LIST13(A) COH_ARG_LIST12(A), A##13& a13
00321 #define COH_ARG_LIST14(A) COH_ARG_LIST13(A), A##14& a14
00322 #define COH_ARG_LIST15(A) COH_ARG_LIST14(A), A##15& a15
00323 #define COH_ARG_LIST16(A) COH_ARG_LIST15(A), A##16& a16
00324 
00325 
00326 
00327 
00328 #define COH_DEFINE_PROXY_CONSTRUCTOR(SPEC, N) \
00329     template<COH_LIST##N (class A)> SPEC(COH_ARG_LIST##N (A)) \
00330         : super_spec(COH_LIST##N (a)) {} \
00331     template<COH_LIST##N (class A)> SPEC(COH_ARG_LIST##N (const A)) \
00332         : super_spec(COH_LIST##N (a)) {}
00333 
00334 
00335 
00336 
00337 
00338 
00339 #define COH_DEFINE_PROXY_CONSTRUCTORS(SPEC) \
00340     SPEC() : super_spec() {} \
00341     SPEC(const SPEC& that) : super_spec(that) {} \
00342     COH_DEFINE_PROXY_CONSTRUCTOR(SPEC, 1)  \
00343     COH_DEFINE_PROXY_CONSTRUCTOR(SPEC, 2)  \
00344     COH_DEFINE_PROXY_CONSTRUCTOR(SPEC, 3)  \
00345     COH_DEFINE_PROXY_CONSTRUCTOR(SPEC, 4)  \
00346     COH_DEFINE_PROXY_CONSTRUCTOR(SPEC, 5)  \
00347     COH_DEFINE_PROXY_CONSTRUCTOR(SPEC, 6)  \
00348     COH_DEFINE_PROXY_CONSTRUCTOR(SPEC, 7)  \
00349     COH_DEFINE_PROXY_CONSTRUCTOR(SPEC, 8)  \
00350     COH_DEFINE_PROXY_CONSTRUCTOR(SPEC, 9)  \
00351     COH_DEFINE_PROXY_CONSTRUCTOR(SPEC, 10) \
00352     COH_DEFINE_PROXY_CONSTRUCTOR(SPEC, 11) \
00353     COH_DEFINE_PROXY_CONSTRUCTOR(SPEC, 12) \
00354     COH_DEFINE_PROXY_CONSTRUCTOR(SPEC, 13) \
00355     COH_DEFINE_PROXY_CONSTRUCTOR(SPEC, 14) \
00356     COH_DEFINE_PROXY_CONSTRUCTOR(SPEC, 15) \
00357     COH_DEFINE_PROXY_CONSTRUCTOR(SPEC, 16)
00358 
00359 
00360 
00361 
00362 #define COH_DEFINE_PROXY_CREATE_METHOD(RETURN, FUNCTION, N) \
00363     template<COH_LIST##N (class A)> static RETURN create(COH_ARG_LIST##N (A)) \
00364         {return FUNCTION(COH_LIST##N(a));} \
00365     template<COH_LIST##N (class A)> static RETURN create(COH_ARG_LIST##N (const A)) \
00366         {return FUNCTION(COH_LIST##N(a));}
00367 
00368 
00369 
00370 
00371 
00372 
00373 
00374 #define COH_DEFINE_CREATE_METHODS(RETURN, FUNCTION) \
00375     static RETURN create() {return FUNCTION();}  \
00376     COH_DEFINE_PROXY_CREATE_METHOD(RETURN, FUNCTION, 1)  \
00377     COH_DEFINE_PROXY_CREATE_METHOD(RETURN, FUNCTION, 2)  \
00378     COH_DEFINE_PROXY_CREATE_METHOD(RETURN, FUNCTION, 3)  \
00379     COH_DEFINE_PROXY_CREATE_METHOD(RETURN, FUNCTION, 4)  \
00380     COH_DEFINE_PROXY_CREATE_METHOD(RETURN, FUNCTION, 5)  \
00381     COH_DEFINE_PROXY_CREATE_METHOD(RETURN, FUNCTION, 6)  \
00382     COH_DEFINE_PROXY_CREATE_METHOD(RETURN, FUNCTION, 7)  \
00383     COH_DEFINE_PROXY_CREATE_METHOD(RETURN, FUNCTION, 8)  \
00384     COH_DEFINE_PROXY_CREATE_METHOD(RETURN, FUNCTION, 9)  \
00385     COH_DEFINE_PROXY_CREATE_METHOD(RETURN, FUNCTION, 10) \
00386     COH_DEFINE_PROXY_CREATE_METHOD(RETURN, FUNCTION, 11) \
00387     COH_DEFINE_PROXY_CREATE_METHOD(RETURN, FUNCTION, 12) \
00388     COH_DEFINE_PROXY_CREATE_METHOD(RETURN, FUNCTION, 13) \
00389     COH_DEFINE_PROXY_CREATE_METHOD(RETURN, FUNCTION, 14) \
00390     COH_DEFINE_PROXY_CREATE_METHOD(RETURN, FUNCTION, 15) \
00391     COH_DEFINE_PROXY_CREATE_METHOD(RETURN, FUNCTION, 16)
00392 
00393 
00394 
00395 
00396 
00397 
00398 
00399 
00400 
00401 
00402 
00403 
00404 
00405 
00406 
00407 
00408 
00409 
00410 
00411 
00412 
00413 
00414 
00415 template<class T> class COH_EXPORT_SPEC factory
00416     {
00417     template<class, class, class> friend class class_spec;
00418 
00419     protected:
00420 
00421 
00422 
00423 
00424 
00425 
00426 
00427 
00428         COH_DEFINE_CREATE_METHODS(T*, new T)
00429     };
00430 
00431 COH_CLOSE_NAMESPACE2
00432 
00433 #endif // COH_LANG_SPEC_HPP