SignatureArgsCollector.h

См. документацию.
00001 /*
00002  * CntmLib - Подсчет ссылок, потоки, синхронизация, асинхронные процедуры, события
00003  * Copyright (c) 2005, Овсеевич Роман, CntmLib@mail.ru
00004  * _______________________________________________________________________________
00005  * Разрешено свободное использование, копирование, распространение, изменение
00006  * (изменение сведений об авторских правах запрещено). Запрещена продажа и 
00007  * включение всей библиотеки или ее частей в другие библиотеки. В сведениях об
00008  * авторских правах на программу (или сведениях о программе, об авторах, 
00009  * использованных средствах разработки и т.д.) должна быть указана информация
00010  * о библиотеке CntmLib, ее авторе и, возможно, сайте или email'е.
00011  * Библиотека поставляется "как есть", без каких-либо гарантий со стороны автора.
00012  */ 
00013 
00014 #ifndef CNTM_SIGNATUREARGSCOLLECTOR_H
00015 #define CNTM_SIGNATUREARGSCOLLECTOR_H
00016 //#include <boost/preprocessor/repetition/enum_params.hpp>
00017 //#include <boost/preprocessor/repetition/enum_binary_params.hpp>
00018 //#include <boost/preprocessor/repetition/repeat.hpp>
00019 #include <Cntm/SystemUtils/AtomicUtils.h>
00020 #include <Cntm/Utils/IntTypes.h>
00021 #include <Cntm/Utils/SignatureInfo.h>
00022 #include <Cntm/SystemUtils/ObjectAllocateBuffer.h>
00023 
00024 namespace Cntm
00025 {
00026 
00027         /**
00028          * Данный модуль предоставляет средства для сборки аргументов вызова в единую структуру (структура Cntm::SignatureInfo::Args, которая будет содержать копии значений всех аргументов, переданных при вызове) для последующей обработки.
00029          * 
00030          * Эта операция проводится с помощью объекта - функтора, для которого определен оператор operator(). Этот оператор принимает аргументы, упаковывает их в общую структуру Cntm::SignatureInfo::Args (т.е. копирует значения аргументов в эту структуру) и вызывает процедуры обработки.
00031          * 
00032          * Для того, чтобы класс обладал такой функциональностью он должен унаследовать клвсс Cntm::SignatureArgsCollector. Данный класс является шаблоном. В качестве параметров шаблона указывается:
00033          * - DeriveClassT - класс, который будет наследовать этот класс;
00034          * - ResT - тип возвращаемого operator() значения;
00035          * - SignatureInfoT - информация о сигнатуре operator() (возвращаемое значение задается отдельно в ResT);
00036          * - ArgsCountI - кол-во аргументов.
00037          * 
00038          * Далее, производный класс должен определить у себя следующие эл-ты:
00039          * - класс с именем SignatureArgsCollectObject, содержащий метод void* ArgsBuffer(), возвращающий указатель на буфер, в котором следует разместить набор аргументов Cntm::SignatureInfo::Args с помощью оператора new с указанием места размещения и метод ConstructArgs(), который оповещает класс, что аргументы инициализированы. Объект этого класса олицетворяет факт вызова operator(). В качестве базового для этого класса можно использовать Cntm::SignatureCollectObjectBase (см. описание этого класса);
00040          * - метод SignatureArgsCollectObject* CreateCollectObject(), создающий объект класса SignatureArgsCollectObject и возвращающий указатель на него. Если в процессе инициализации аргументов после вызова CreateCollectObject(), но до ProcessCollectObject() произойдет исключение, то созданный объект SignatureArgsCollectObject будет автоматически уничтожен оператором delete, а вызов метода ProcessCollectObject() произведен не будет;
00041          * - метод ResT ProcessCollectObject(SignatureArgsCollectObject* Object), принимающий SignatureArgsCollectObject с заполненными параметрами, производящий обработку полученных параметров и возвращающий результат оператора (). Данный метод должен отвечать за уничтожение объекта SignatureArgsCollectObject, в т.ч. и при исключениях;
00042          * - метод bool NoNeedCreateCollectObject(), определяющий нужно ли создавать объект класса SignatureArgsCollectObject и выполнять его обработку. Если данный метод вернет true, то будет вызван метод NoneProcessCollectObject для возврата значения по умолчанию, если false, то произойдет нормальная обработка вызова с помощью 2 вышеуказанных методов;
00043          * - метод ResT NoneProcessCollectObject(), возвращающий значение по умолчанию, когда обработка вызова не требуется.
00044          * 
00045          *      Такой наследующий класс может выглядеть следующим образом:
00046          * template < typename SignatureT >
00047          * class Class1: public Cntm::SignatureArgsCollector < Class1 < SignatureT > , void, Cntm::SignatureInfo <SignatureT>, Cntm::SignatureInfo <SignatureT> :: argsCount >
00048          * {
00049          * private:
00050          *              friend class Cntm::SignatureArgsCollector< Class1 < SignatureT > , void, Cntm::SignatureInfo <SignatureT>, Cntm::SignatureInfo <SignatureT> :: argsCount >;
00051          *              typedef SignatureArgsCollectObjectBase<typename Cntm::SignatureInfo <SignatureT>::Args> SignatureArgsCollectObject;
00052          *              SignatureCollectObject* CreateCollectObject() { return new SignatureCollectObject; }
00053          *              void ProcessCollectObject(SignatureCollectObject* Object) { cout << "ProcessCollectObject " << SignInfoType::argsCount << endl; }
00054          *              bool NoNeedCreateCollectObject() { return false; }
00055          *              void ProcessCollectObject(SignatureCollectObject* Object) {}
00056          * };
00057          */
00058         template < typename DeriveClassT, typename ResT, typename SignatureInfoT, int ArgsCountI >
00059         class SignatureArgsCollector
00060         {
00061         };
00062 
00063 /*
00064 // Макрос для определения общей информации для функций и методов о сигнатуре.
00065 #define CNTM_SIGNATURE_ARGS_COLLECTOR(z, n, _) \
00066         template < typename DeriveClassT, typename ResT,  typename SignatureInfoT > \
00067         class SignatureArgsCollector < DeriveClassT, ResT, SignatureInfoT, n > \
00068         { \
00069         public: \
00070                 typedef SignatureInfoT SignInfoType; \
00071                 ResT operator() (BOOST_PP_ENUM_BINARY_PARAMS_Z(z, n, const typename SignatureInfoT::StoreType, & Arg)) \
00072                 { \
00073                         if (static_cast<DeriveClassT*>(this)->NoNeedCreateCollectObject()) \
00074                                 return static_cast<DeriveClassT*>(this)->NoneProcessCollectObject(); \
00075                         typename DeriveClassT::SignatureArgsCollectObject* obj = static_cast<DeriveClassT*>(this)->CreateCollectObject(); \
00076                         try { \
00077                                 new (obj->ArgsBuffer()) typename SignatureInfoT::Args(BOOST_PP_ENUM_PARAMS_Z(z, n, Arg)); \
00078                                 obj->ConstructArgs(); } \
00079                         catch (...) { \
00080                                 delete obj; \
00081                                 throw; } \
00082                         return static_cast<DeriveClassT*>(this)->ProcessCollectObject(obj); \
00083                 } \
00084         };
00085 
00086         BOOST_PP_REPEAT(CNTM_SIGNATURES_MAX_ARGS, CNTM_SIGNATURE_ARGS_COLLECTOR, CNTM_SIGNATURES_EMPTY)
00087 */
00088 
00089 #define CNTM_STRUCT_SIGNATURE_ARG_COLLECTOR class Signature##ArgsCollector
00090 
00091 template < typename DeriveClassT, typename ResT, typename SignatureInfoT > CNTM_STRUCT_SIGNATURE_ARG_COLLECTOR < DeriveClassT, ResT, SignatureInfoT, 0 > { public: typedef SignatureInfoT SignInfoType; ResT operator() () { if (static_cast<DeriveClassT*>(this)->NoNeedCreateCollectObject()) return static_cast<DeriveClassT*>(this)->NoneProcessCollectObject(); typename DeriveClassT::SignatureArgsCollectObject* obj = static_cast<DeriveClassT*>(this)->CreateCollectObject(); try { new (obj->ArgsBuffer()) typename SignatureInfoT::Args(); obj->ConstructArgs(); } catch (...) { delete obj; throw; } return static_cast<DeriveClassT*>(this)->ProcessCollectObject(obj); } };
00092 template < typename DeriveClassT, typename ResT, typename SignatureInfoT > CNTM_STRUCT_SIGNATURE_ARG_COLLECTOR < DeriveClassT, ResT, SignatureInfoT, 1 > { public: typedef SignatureInfoT SignInfoType; ResT operator() ( const typename SignatureInfoT::StoreType0 & Arg0) { if (static_cast<DeriveClassT*>(this)->NoNeedCreateCollectObject()) return static_cast<DeriveClassT*>(this)->NoneProcessCollectObject(); typename DeriveClassT::SignatureArgsCollectObject* obj = static_cast<DeriveClassT*>(this)->CreateCollectObject(); try { new (obj->ArgsBuffer()) typename SignatureInfoT::Args( Arg0); obj->ConstructArgs(); } catch (...) { delete obj; throw; } return static_cast<DeriveClassT*>(this)->ProcessCollectObject(obj); } };
00093 template < typename DeriveClassT, typename ResT, typename SignatureInfoT > CNTM_STRUCT_SIGNATURE_ARG_COLLECTOR < DeriveClassT, ResT, SignatureInfoT, 2 > { public: typedef SignatureInfoT SignInfoType; ResT operator() ( const typename SignatureInfoT::StoreType0 & Arg0 , const typename SignatureInfoT::StoreType1 & Arg1) { if (static_cast<DeriveClassT*>(this)->NoNeedCreateCollectObject()) return static_cast<DeriveClassT*>(this)->NoneProcessCollectObject(); typename DeriveClassT::SignatureArgsCollectObject* obj = static_cast<DeriveClassT*>(this)->CreateCollectObject(); try { new (obj->ArgsBuffer()) typename SignatureInfoT::Args( Arg0 , Arg1); obj->ConstructArgs(); } catch (...) { delete obj; throw; } return static_cast<DeriveClassT*>(this)->ProcessCollectObject(obj); } };
00094 template < typename DeriveClassT, typename ResT, typename SignatureInfoT > CNTM_STRUCT_SIGNATURE_ARG_COLLECTOR < DeriveClassT, ResT, SignatureInfoT, 3 > { public: typedef SignatureInfoT SignInfoType; ResT operator() ( const typename SignatureInfoT::StoreType0 & Arg0 , const typename SignatureInfoT::StoreType1 & Arg1 , const typename SignatureInfoT::StoreType2 & Arg2) { if (static_cast<DeriveClassT*>(this)->NoNeedCreateCollectObject()) return static_cast<DeriveClassT*>(this)->NoneProcessCollectObject(); typename DeriveClassT::SignatureArgsCollectObject* obj = static_cast<DeriveClassT*>(this)->CreateCollectObject(); try { new (obj->ArgsBuffer()) typename SignatureInfoT::Args( Arg0 , Arg1 , Arg2); obj->ConstructArgs(); } catch (...) { delete obj; throw; } return static_cast<DeriveClassT*>(this)->ProcessCollectObject(obj); } }; 
00095 template < typename DeriveClassT, typename ResT, typename SignatureInfoT > CNTM_STRUCT_SIGNATURE_ARG_COLLECTOR < DeriveClassT, ResT, SignatureInfoT, 4 > { public: typedef SignatureInfoT SignInfoType; ResT operator() ( const typename SignatureInfoT::StoreType0 & Arg0 , const typename SignatureInfoT::StoreType1 & Arg1 , const typename SignatureInfoT::StoreType2 & Arg2 , const typename SignatureInfoT::StoreType3 & Arg3) { if (static_cast<DeriveClassT*>(this)->NoNeedCreateCollectObject()) return static_cast<DeriveClassT*>(this)->NoneProcessCollectObject(); typename DeriveClassT::SignatureArgsCollectObject* obj = static_cast<DeriveClassT*>(this)->CreateCollectObject(); try { new (obj->ArgsBuffer()) typename SignatureInfoT::Args( Arg0 , Arg1 , Arg2 , Arg3); obj->ConstructArgs(); } catch (...) { delete obj; throw; } return static_cast<DeriveClassT*>(this)->ProcessCollectObject(obj); } };
00096 template < typename DeriveClassT, typename ResT, typename SignatureInfoT > CNTM_STRUCT_SIGNATURE_ARG_COLLECTOR < DeriveClassT, ResT, SignatureInfoT, 5 > { public: typedef SignatureInfoT SignInfoType; ResT operator() ( const typename SignatureInfoT::StoreType0 & Arg0 , const typename SignatureInfoT::StoreType1 & Arg1 , const typename SignatureInfoT::StoreType2 & Arg2 , const typename SignatureInfoT::StoreType3 & Arg3 , const typename SignatureInfoT::StoreType4 & Arg4) { if (static_cast<DeriveClassT*>(this)->NoNeedCreateCollectObject()) return static_cast<DeriveClassT*>(this)->NoneProcessCollectObject(); typename DeriveClassT::SignatureArgsCollectObject* obj = static_cast<DeriveClassT*>(this)->CreateCollectObject(); try { new (obj->ArgsBuffer()) typename SignatureInfoT::Args( Arg0 , Arg1 , Arg2 , Arg3 , Arg4); obj->ConstructArgs(); } catch (...) { delete obj; throw; } return static_cast<DeriveClassT*>(this)->ProcessCollectObject(obj); } }; 
00097 template < typename DeriveClassT, typename ResT, typename SignatureInfoT > CNTM_STRUCT_SIGNATURE_ARG_COLLECTOR < DeriveClassT, ResT, SignatureInfoT, 6 > { public: typedef SignatureInfoT SignInfoType; ResT operator() ( const typename SignatureInfoT::StoreType0 & Arg0 , const typename SignatureInfoT::StoreType1 & Arg1 , const typename SignatureInfoT::StoreType2 & Arg2 , const typename SignatureInfoT::StoreType3 & Arg3 , const typename SignatureInfoT::StoreType4 & Arg4 , const typename SignatureInfoT::StoreType5 & Arg5) { if (static_cast<DeriveClassT*>(this)->NoNeedCreateCollectObject()) return static_cast<DeriveClassT*>(this)->NoneProcessCollectObject(); typename DeriveClassT::SignatureArgsCollectObject* obj = static_cast<DeriveClassT*>(this)->CreateCollectObject(); try { new (obj->ArgsBuffer()) typename SignatureInfoT::Args( Arg0 , Arg1 , Arg2 , Arg3 , Arg4 , Arg5); obj->ConstructArgs(); } catch (...) { delete obj; throw; } return static_cast<DeriveClassT*>(this)->ProcessCollectObject(obj); } };
00098 template < typename DeriveClassT, typename ResT, typename SignatureInfoT > CNTM_STRUCT_SIGNATURE_ARG_COLLECTOR < DeriveClassT, ResT, SignatureInfoT, 7 > { public: typedef SignatureInfoT SignInfoType; ResT operator() ( const typename SignatureInfoT::StoreType0 & Arg0 , const typename SignatureInfoT::StoreType1 & Arg1 , const typename SignatureInfoT::StoreType2 & Arg2 , const typename SignatureInfoT::StoreType3 & Arg3 , const typename SignatureInfoT::StoreType4 & Arg4 , const typename SignatureInfoT::StoreType5 & Arg5 , const typename SignatureInfoT::StoreType6 & Arg6) { if (static_cast<DeriveClassT*>(this)->NoNeedCreateCollectObject()) return static_cast<DeriveClassT*>(this)->NoneProcessCollectObject(); typename DeriveClassT::SignatureArgsCollectObject* obj = static_cast<DeriveClassT*>(this)->CreateCollectObject(); try { new (obj->ArgsBuffer()) typename SignatureInfoT::Args( Arg0 , Arg1 , Arg2 , Arg3 , Arg4 , Arg5 , Arg6); obj->ConstructArgs(); } catch (...) { delete obj; throw; } return static_cast<DeriveClassT*>(this)->ProcessCollectObject(obj); } }; 
00099 template < typename DeriveClassT, typename ResT, typename SignatureInfoT > CNTM_STRUCT_SIGNATURE_ARG_COLLECTOR < DeriveClassT, ResT, SignatureInfoT, 8 > { public: typedef SignatureInfoT SignInfoType; ResT operator() ( const typename SignatureInfoT::StoreType0 & Arg0 , const typename SignatureInfoT::StoreType1 & Arg1 , const typename SignatureInfoT::StoreType2 & Arg2 , const typename SignatureInfoT::StoreType3 & Arg3 , const typename SignatureInfoT::StoreType4 & Arg4 , const typename SignatureInfoT::StoreType5 & Arg5 , const typename SignatureInfoT::StoreType6 & Arg6 , const typename SignatureInfoT::StoreType7 & Arg7) { if (static_cast<DeriveClassT*>(this)->NoNeedCreateCollectObject()) return static_cast<DeriveClassT*>(this)->NoneProcessCollectObject(); typename DeriveClassT::SignatureArgsCollectObject* obj = static_cast<DeriveClassT*>(this)->CreateCollectObject(); try { new (obj->ArgsBuffer()) typename SignatureInfoT::Args( Arg0 , Arg1 , Arg2 , Arg3 , Arg4 , Arg5 , Arg6 , Arg7); obj->ConstructArgs(); } catch (...) { delete obj; throw; } return static_cast<DeriveClassT*>(this)->ProcessCollectObject(obj); } }; 
00100 template < typename DeriveClassT, typename ResT, typename SignatureInfoT > CNTM_STRUCT_SIGNATURE_ARG_COLLECTOR < DeriveClassT, ResT, SignatureInfoT, 9 > { public: typedef SignatureInfoT SignInfoType; ResT operator() ( const typename SignatureInfoT::StoreType0 & Arg0 , const typename SignatureInfoT::StoreType1 & Arg1 , const typename SignatureInfoT::StoreType2 & Arg2 , const typename SignatureInfoT::StoreType3 & Arg3 , const typename SignatureInfoT::StoreType4 & Arg4 , const typename SignatureInfoT::StoreType5 & Arg5 , const typename SignatureInfoT::StoreType6 & Arg6 , const typename SignatureInfoT::StoreType7 & Arg7 , const typename SignatureInfoT::StoreType8 & Arg8) { if (static_cast<DeriveClassT*>(this)->NoNeedCreateCollectObject()) return static_cast<DeriveClassT*>(this)->NoneProcessCollectObject(); typename DeriveClassT::SignatureArgsCollectObject* obj = static_cast<DeriveClassT*>(this)->CreateCollectObject(); try { new (obj->ArgsBuffer()) typename SignatureInfoT::Args( Arg0 , Arg1 , Arg2 , Arg3 , Arg4 , Arg5 , Arg6 , Arg7 , Arg8); obj->ConstructArgs(); } catch (...) { delete obj; throw; } return static_cast<DeriveClassT*>(this)->ProcessCollectObject(obj); } };
00101 template < typename DeriveClassT, typename ResT, typename SignatureInfoT > CNTM_STRUCT_SIGNATURE_ARG_COLLECTOR < DeriveClassT, ResT, SignatureInfoT, 10 > { public: typedef SignatureInfoT SignInfoType; ResT operator() ( const typename SignatureInfoT::StoreType0 & Arg0 , const typename SignatureInfoT::StoreType1 & Arg1 , const typename SignatureInfoT::StoreType2 & Arg2 , const typename SignatureInfoT::StoreType3 & Arg3 , const typename SignatureInfoT::StoreType4 & Arg4 , const typename SignatureInfoT::StoreType5 & Arg5 , const typename SignatureInfoT::StoreType6 & Arg6 , const typename SignatureInfoT::StoreType7 & Arg7 , const typename SignatureInfoT::StoreType8 & Arg8 , const typename SignatureInfoT::StoreType9 & Arg9) { if (static_cast<DeriveClassT*>(this)->NoNeedCreateCollectObject()) return static_cast<DeriveClassT*>(this)->NoneProcessCollectObject(); typename DeriveClassT::SignatureArgsCollectObject* obj = static_cast<DeriveClassT*>(this)->CreateCollectObject(); try { new (obj->ArgsBuffer()) typename SignatureInfoT::Args( Arg0 , Arg1 , Arg2 , Arg3 , Arg4 , Arg5 , Arg6 , Arg7 , Arg8 , Arg9); obj->ConstructArgs(); } catch (...) { delete obj; throw; } return static_cast<DeriveClassT*>(this)->ProcessCollectObject(obj); } }; 
00102 template < typename DeriveClassT, typename ResT, typename SignatureInfoT > CNTM_STRUCT_SIGNATURE_ARG_COLLECTOR < DeriveClassT, ResT, SignatureInfoT, 11 > { public: typedef SignatureInfoT SignInfoType; ResT operator() ( const typename SignatureInfoT::StoreType0 & Arg0 , const typename SignatureInfoT::StoreType1 & Arg1 , const typename SignatureInfoT::StoreType2 & Arg2 , const typename SignatureInfoT::StoreType3 & Arg3 , const typename SignatureInfoT::StoreType4 & Arg4 , const typename SignatureInfoT::StoreType5 & Arg5 , const typename SignatureInfoT::StoreType6 & Arg6 , const typename SignatureInfoT::StoreType7 & Arg7 , const typename SignatureInfoT::StoreType8 & Arg8 , const typename SignatureInfoT::StoreType9 & Arg9 , const typename SignatureInfoT::StoreType10 & Arg10) { if (static_cast<DeriveClassT*>(this)->NoNeedCreateCollectObject()) return static_cast<DeriveClassT*>(this)->NoneProcessCollectObject(); typename DeriveClassT::SignatureArgsCollectObject* obj = static_cast<DeriveClassT*>(this)->CreateCollectObject(); try { new (obj->ArgsBuffer()) typename SignatureInfoT::Args( Arg0 , Arg1 , Arg2 , Arg3 , Arg4 , Arg5 , Arg6 , Arg7 , Arg8 , Arg9 , Arg10); obj->ConstructArgs(); } catch (...) { delete obj; throw; } return static_cast<DeriveClassT*>(this)->ProcessCollectObject(obj); } };
00103 template < typename DeriveClassT, typename ResT, typename SignatureInfoT > CNTM_STRUCT_SIGNATURE_ARG_COLLECTOR < DeriveClassT, ResT, SignatureInfoT, 12 > { public: typedef SignatureInfoT SignInfoType; ResT operator() ( const typename SignatureInfoT::StoreType0 & Arg0 , const typename SignatureInfoT::StoreType1 & Arg1 , const typename SignatureInfoT::StoreType2 & Arg2 , const typename SignatureInfoT::StoreType3 & Arg3 , const typename SignatureInfoT::StoreType4 & Arg4 , const typename SignatureInfoT::StoreType5 & Arg5 , const typename SignatureInfoT::StoreType6 & Arg6 , const typename SignatureInfoT::StoreType7 & Arg7 , const typename SignatureInfoT::StoreType8 & Arg8 , const typename SignatureInfoT::StoreType9 & Arg9 , const typename SignatureInfoT::StoreType10 & Arg10 , const typename SignatureInfoT::StoreType11 & Arg11) { if (static_cast<DeriveClassT*>(this)->NoNeedCreateCollectObject()) return static_cast<DeriveClassT*>(this)->NoneProcessCollectObject(); typename DeriveClassT::SignatureArgsCollectObject* obj = static_cast<DeriveClassT*>(this)->CreateCollectObject(); try { new (obj->ArgsBuffer()) typename SignatureInfoT::Args( Arg0 , Arg1 , Arg2 , Arg3 , Arg4 , Arg5 , Arg6 , Arg7 , Arg8 , Arg9 , Arg10 , Arg11); obj->ConstructArgs(); } catch (...) { delete obj; throw; } return static_cast<DeriveClassT*>(this)->ProcessCollectObject(obj); } }; 
00104 template < typename DeriveClassT, typename ResT, typename SignatureInfoT > CNTM_STRUCT_SIGNATURE_ARG_COLLECTOR < DeriveClassT, ResT, SignatureInfoT, 13 > { public: typedef SignatureInfoT SignInfoType; ResT operator() ( const typename SignatureInfoT::StoreType0 & Arg0 , const typename SignatureInfoT::StoreType1 & Arg1 , const typename SignatureInfoT::StoreType2 & Arg2 , const typename SignatureInfoT::StoreType3 & Arg3 , const typename SignatureInfoT::StoreType4 & Arg4 , const typename SignatureInfoT::StoreType5 & Arg5 , const typename SignatureInfoT::StoreType6 & Arg6 , const typename SignatureInfoT::StoreType7 & Arg7 , const typename SignatureInfoT::StoreType8 & Arg8 , const typename SignatureInfoT::StoreType9 & Arg9 , const typename SignatureInfoT::StoreType10 & Arg10 , const typename SignatureInfoT::StoreType11 & Arg11 , const typename SignatureInfoT::StoreType12 & Arg12) { if (static_cast<DeriveClassT*>(this)->NoNeedCreateCollectObject()) return static_cast<DeriveClassT*>(this)->NoneProcessCollectObject(); typename DeriveClassT::SignatureArgsCollectObject* obj = static_cast<DeriveClassT*>(this)->CreateCollectObject(); try { new (obj->ArgsBuffer()) typename SignatureInfoT::Args( Arg0 , Arg1 , Arg2 , Arg3 , Arg4 , Arg5 , Arg6 , Arg7 , Arg8 , Arg9 , Arg10 , Arg11 , Arg12); obj->ConstructArgs(); } catch (...) { delete obj; throw; } return static_cast<DeriveClassT*>(this)->ProcessCollectObject(obj); } };
00105 template < typename DeriveClassT, typename ResT, typename SignatureInfoT > CNTM_STRUCT_SIGNATURE_ARG_COLLECTOR < DeriveClassT, ResT, SignatureInfoT, 14 > { public: typedef SignatureInfoT SignInfoType; ResT operator() ( const typename SignatureInfoT::StoreType0 & Arg0 , const typename SignatureInfoT::StoreType1 & Arg1 , const typename SignatureInfoT::StoreType2 & Arg2 , const typename SignatureInfoT::StoreType3 & Arg3 , const typename SignatureInfoT::StoreType4 & Arg4 , const typename SignatureInfoT::StoreType5 & Arg5 , const typename SignatureInfoT::StoreType6 & Arg6 , const typename SignatureInfoT::StoreType7 & Arg7 , const typename SignatureInfoT::StoreType8 & Arg8 , const typename SignatureInfoT::StoreType9 & Arg9 , const typename SignatureInfoT::StoreType10 & Arg10 , const typename SignatureInfoT::StoreType11 & Arg11 , const typename SignatureInfoT::StoreType12 & Arg12 , const typename SignatureInfoT::StoreType13 & Arg13) { if (static_cast<DeriveClassT*>(this)->NoNeedCreateCollectObject()) return static_cast<DeriveClassT*>(this)->NoneProcessCollectObject(); typename DeriveClassT::SignatureArgsCollectObject* obj = static_cast<DeriveClassT*>(this)->CreateCollectObject(); try { new (obj->ArgsBuffer()) typename SignatureInfoT::Args( Arg0 , Arg1 , Arg2 , Arg3 , Arg4 , Arg5 , Arg6 , Arg7 , Arg8 , Arg9 , Arg10 , Arg11 , Arg12 , Arg13); obj->ConstructArgs(); } catch (...) { delete obj; throw; } return static_cast<DeriveClassT*>(this)->ProcessCollectObject(obj); } }; 
00106 template < typename DeriveClassT, typename ResT, typename SignatureInfoT > CNTM_STRUCT_SIGNATURE_ARG_COLLECTOR < DeriveClassT, ResT, SignatureInfoT, 15 > { public: typedef SignatureInfoT SignInfoType; ResT operator() ( const typename SignatureInfoT::StoreType0 & Arg0 , const typename SignatureInfoT::StoreType1 & Arg1 , const typename SignatureInfoT::StoreType2 & Arg2 , const typename SignatureInfoT::StoreType3 & Arg3 , const typename SignatureInfoT::StoreType4 & Arg4 , const typename SignatureInfoT::StoreType5 & Arg5 , const typename SignatureInfoT::StoreType6 & Arg6 , const typename SignatureInfoT::StoreType7 & Arg7 , const typename SignatureInfoT::StoreType8 & Arg8 , const typename SignatureInfoT::StoreType9 & Arg9 , const typename SignatureInfoT::StoreType10 & Arg10 , const typename SignatureInfoT::StoreType11 & Arg11 , const typename SignatureInfoT::StoreType12 & Arg12 , const typename SignatureInfoT::StoreType13 & Arg13 , const typename SignatureInfoT::StoreType14 & Arg14) { if (static_cast<DeriveClassT*>(this)->NoNeedCreateCollectObject()) return static_cast<DeriveClassT*>(this)->NoneProcessCollectObject(); typename DeriveClassT::SignatureArgsCollectObject* obj = static_cast<DeriveClassT*>(this)->CreateCollectObject(); try { new (obj->ArgsBuffer()) typename SignatureInfoT::Args( Arg0 , Arg1 , Arg2 , Arg3 , Arg4 , Arg5 , Arg6 , Arg7 , Arg8 , Arg9 , Arg10 , Arg11 , Arg12 , Arg13 , Arg14); obj->ConstructArgs(); } catch (...) { delete obj; throw; } return static_cast<DeriveClassT*>(this)->ProcessCollectObject(obj); } };
00107 template < typename DeriveClassT, typename ResT, typename SignatureInfoT > CNTM_STRUCT_SIGNATURE_ARG_COLLECTOR < DeriveClassT, ResT, SignatureInfoT, 16 > { public: typedef SignatureInfoT SignInfoType; ResT operator() ( const typename SignatureInfoT::StoreType0 & Arg0 , const typename SignatureInfoT::StoreType1 & Arg1 , const typename SignatureInfoT::StoreType2 & Arg2 , const typename SignatureInfoT::StoreType3 & Arg3 , const typename SignatureInfoT::StoreType4 & Arg4 , const typename SignatureInfoT::StoreType5 & Arg5 , const typename SignatureInfoT::StoreType6 & Arg6 , const typename SignatureInfoT::StoreType7 & Arg7 , const typename SignatureInfoT::StoreType8 & Arg8 , const typename SignatureInfoT::StoreType9 & Arg9 , const typename SignatureInfoT::StoreType10 & Arg10 , const typename SignatureInfoT::StoreType11 & Arg11 , const typename SignatureInfoT::StoreType12 & Arg12 , const typename SignatureInfoT::StoreType13 & Arg13 , const typename SignatureInfoT::StoreType14 & Arg14 , const typename SignatureInfoT::StoreType15 & Arg15) { if (static_cast<DeriveClassT*>(this)->NoNeedCreateCollectObject()) return static_cast<DeriveClassT*>(this)->NoneProcessCollectObject(); typename DeriveClassT::SignatureArgsCollectObject* obj = static_cast<DeriveClassT*>(this)->CreateCollectObject(); try { new (obj->ArgsBuffer()) typename SignatureInfoT::Args( Arg0 , Arg1 , Arg2 , Arg3 , Arg4 , Arg5 , Arg6 , Arg7 , Arg8 , Arg9 , Arg10 , Arg11 , Arg12 , Arg13 , Arg14 , Arg15); obj->ConstructArgs(); } catch (...) { delete obj; throw; } return static_cast<DeriveClassT*>(this)->ProcessCollectObject(obj); } };
00108 
00109         /**
00110          * Базовый класс для класса SignatureArgsCollectObject, используемого в operator(). Содержит буфер для аргументов нужного размера. Деструктор класса производит уничтожение значений параметров, которые были сохранены в классе.
00111          */
00112         template < typename SignatureArgsT >
00113         class SignatureArgsCollectObjectBase
00114         {
00115         public:
00116 
00117                 /**
00118                  * Конструктор по умолчанию.
00119                  */
00120                 SignatureArgsCollectObjectBase() {}
00121                 
00122                 /**
00123                  * Деструктор. Производит уничтожение значений параметров, которые были сохранены в классе.
00124                  */
00125                 ~SignatureArgsCollectObjectBase() { DestroyArgs(); }
00126 
00127                 /**
00128                  * Возвращает указатель на буфер, в котором будут размещены значения аргументов.
00129                  * 
00130                  * Метод требуется в operator().
00131                  */
00132                 void* ArgsBuffer() { return argsBuffer.Place(); }
00133 
00134                 /**
00135                  * Возвращает указатель на структуру, хранящую значения аргументов.
00136                  */
00137                 SignatureArgsT* Args() { return reinterpret_cast<SignatureArgsT*>(argsBuffer.Place()); }
00138 
00139                 /**
00140                  * Сообщить объекту, что буфер успешно заполнен аргументами.
00141                  */
00142                 void ConstructArgs() { argsConstructed.SetValue(1); }
00143                 
00144                 /**
00145                  * Если аргументы были инициализированы, то производится их разрушение.
00146                  */
00147                 void DestroyArgs() throw()
00148                 {
00149                         try
00150                         {
00151                                 if (argsConstructed.DecAndTest()) // Если была 1 - значит есть аргументы.
00152                                         Args()->~SignatureArgsT();
00153                                 else
00154                                         argsConstructed.SetValue(0); // Возвращаем значение обратно, чтобы не переполнилось.
00155                         }
00156                         catch(...)
00157                         {
00158                         }
00159                 }
00160                 
00161         private:
00162                 
00163                 typedef unsigned char BufItem;
00164                 
00165                 /**
00166                  * Буфер, в котором хранится структура, содержащая значения аргументов.
00167                  */
00168                 SpecUtils::ObjectAllocateBuffer<SignatureArgsT> argsBuffer;
00169                 
00170                 /**
00171                  * Флаг, содержащий информацию о том хранит ли argsBuffer значения аргументов или он пуст.
00172                  */
00173                 SpecUtils::AtomicVariable argsConstructed;
00174         };
00175         
00176 }
00177 
00178 /* 
00179 Развертка макросов выглядит примерно так:
00180 template < typename DeriveClassT, typename ResT,  typename SignatureInfoT >
00181 class SignatureArgsCollector < DeriveClassT, ResT, SignatureInfoT, 1 >
00182 {
00183 public:
00184         ResT operator() (const typename SignatureInfoT::StoreType0& Arg0)
00185         {
00186                 // Проверяем, нужно ли выполнять какие либо действия или нет.
00187                 if (static_cast<DeriveClassT*>(this)->NoNeedCreateCollectObject())
00188                         return static_cast<DeriveClassT*>(this)->NoneProcessCollectObject();
00189                         
00190                 // Создаем объект вызова. Если в процессе инициализации аргументов произойдет исключение, то объект будет удален.
00191                 typename DeriveClassT::SignatureArgsCollectObject* obj = static_cast<DeriveClassT*>(this)->CreateCollectObject();
00192                 try
00193                 {
00194                         new (obj->ArgsBuffer()) typename SignatureInfoT::Args(Arg0); // Инициализируем аргументы.
00195                         obj->ConstructArgs(); // Сообщаем объекту, что аргументы успешно инициализированы.
00196                 }
00197                 catch (...)
00198                 {
00199                         delete obj; // В случае исключения уничтожаем объект вызова немедленно.
00200                         throw;
00201                 }
00202                 
00203                 // Вызываем обработчик объекта вызова с инициализированными аргументами.
00204                 return static_cast<DeriveClassT*>(this)->ProcessCollectObject(obj);
00205         }
00206 };
00207 */
00208         
00209 #endif //CNTM_SIGNATUREARGSCOLLECTOR_H

SourceForge.net Logo
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой  doxygen 1.5.3