Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-18 10:14:56

0001 /*
0002  * Licensed to the Apache Software Foundation (ASF) under one or more
0003  * contributor license agreements.  See the NOTICE file distributed with
0004  * this work for additional information regarding copyright ownership.
0005  * The ASF licenses this file to You under the Apache License, Version 2.0
0006  * (the "License"); you may not use this file except in compliance with
0007  * the License.  You may obtain a copy of the License at
0008  * 
0009  *      http://www.apache.org/licenses/LICENSE-2.0
0010  * 
0011  * Unless required by applicable law or agreed to in writing, software
0012  * distributed under the License is distributed on an "AS IS" BASIS,
0013  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
0014  * See the License for the specific language governing permissions and
0015  * limitations under the License.
0016  */
0017 
0018 /*
0019  * $Id$
0020  */
0021 
0022 #if !defined(XERCESC_INCLUDE_GUARD_XPROTOTYPE_HPP)
0023 #define XERCESC_INCLUDE_GUARD_XPROTOTYPE_HPP
0024 
0025 #include <xercesc/util/PlatformUtils.hpp>
0026 
0027 XERCES_CPP_NAMESPACE_BEGIN
0028 
0029 class XSerializeEngine;
0030 class XSerializable;
0031 
0032 class XMLUTIL_EXPORT XProtoType
0033 {
0034 public:
0035 
0036            void       store(XSerializeEngine& serEng) const;
0037 
0038     static void        load(XSerializeEngine&          serEng
0039                           , XMLByte*          const    name
0040                           , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
0041                           );
0042 
0043     // -------------------------------------------------------------------------------
0044     //  data
0045     //
0046     //  fClassName: 
0047     //            name of the XSerializable derivatives
0048     //
0049     //  fCreateObject:
0050     //            pointer to the factory method (createObject()) 
0051     //            of the XSerializable derivatives
0052     //
0053     // -------------------------------------------------------------------------------
0054 
0055     XMLByte*          fClassName;
0056 
0057     XSerializable*    (*fCreateObject)(MemoryManager*);
0058 
0059 };
0060 
0061 #define DECL_XPROTOTYPE(class_name) \
0062 static  XProtoType        class##class_name;                   \
0063 static  XSerializable*    createObject(MemoryManager* manager);
0064 
0065 /***
0066  * For non-abstract class
0067  ***/
0068 #define IMPL_XPROTOTYPE_TOCREATE(class_name) \
0069 IMPL_XPROTOTYPE_INSTANCE(class_name) \
0070 XSerializable* class_name::createObject(MemoryManager* manager) \
0071 {return new (manager) class_name(manager);}
0072 
0073 /***
0074 * For abstract class
0075  ***/
0076 #define IMPL_XPROTOTYPE_NOCREATE(class_name) \
0077 IMPL_XPROTOTYPE_INSTANCE(class_name) \
0078 XSerializable* class_name::createObject(MemoryManager*) \
0079 {return 0;}
0080 
0081 
0082 /***
0083  * Helper Macro 
0084  ***/
0085 #define XPROTOTYPE_CLASS(class_name) ((XProtoType*)(&class_name::class##class_name))
0086 
0087 #define IMPL_XPROTOTYPE_INSTANCE(class_name) \
0088 XProtoType class_name::class##class_name = \
0089 {const_cast<XMLByte*>(reinterpret_cast<const XMLByte *>(#class_name)), class_name::createObject };
0090 
0091 XERCES_CPP_NAMESPACE_END
0092 
0093 #endif