Apache log4cxx  Version 0.11.0
object.h
1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements. See the NOTICE file distributed with
4  * this work for additional information regarding copyright ownership.
5  * The ASF licenses this file to You under the Apache License, Version 2.0
6  * (the "License"); you may not use this file except in compliance with
7  * the License. You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 #ifndef _LOG4CXX_HELPERS_OBJECT_H
19 #define _LOG4CXX_HELPERS_OBJECT_H
20 
21 #include <log4cxx/logstring.h>
22 #include <log4cxx/helpers/class.h>
23 #include <log4cxx/helpers/objectptr.h>
24 #include <log4cxx/helpers/classregistration.h>
25 
26 
27 #define DECLARE_ABSTRACT_LOG4CXX_OBJECT(object)\
28  public:\
29  class Clazz##object : public helpers::Class\
30  {\
31  public:\
32  Clazz##object() : helpers::Class() {}\
33  virtual ~Clazz##object() {}\
34  virtual log4cxx::LogString getName() const { return LOG4CXX_STR(#object); } \
35  };\
36  virtual const helpers::Class& getClass() const;\
37  static const helpers::Class& getStaticClass(); \
38  static const log4cxx::helpers::ClassRegistration& registerClass();
39 
40 #define DECLARE_LOG4CXX_OBJECT(object)\
41  public:\
42  class Clazz##object : public helpers::Class\
43  {\
44  public:\
45  Clazz##object() : helpers::Class() {}\
46  virtual ~Clazz##object() {}\
47  virtual log4cxx::LogString getName() const { return LOG4CXX_STR(#object); } \
48  virtual helpers::ObjectPtr newInstance() const\
49  {\
50  return new object();\
51  }\
52  };\
53  virtual const helpers::Class& getClass() const;\
54  static const helpers::Class& getStaticClass(); \
55  static const log4cxx::helpers::ClassRegistration& registerClass();
56 
57 #define DECLARE_LOG4CXX_OBJECT_WITH_CUSTOM_CLASS(object, class)\
58  public:\
59  virtual const helpers::Class& getClass() const;\
60  static const helpers::Class& getStaticClass();\
61  static const log4cxx::helpers::ClassRegistration& registerClass();
62 
63 #define IMPLEMENT_LOG4CXX_OBJECT(object)\
64  const ::log4cxx::helpers::Class& object::getClass() const { return getStaticClass(); }\
65  const ::log4cxx::helpers::Class& object::getStaticClass() { \
66  static Clazz##object theClass; \
67  return theClass; \
68  } \
69  const log4cxx::helpers::ClassRegistration& object::registerClass() { \
70  static log4cxx::helpers::ClassRegistration classReg(object::getStaticClass); \
71  return classReg; \
72  }\
73  namespace log4cxx { namespace classes { \
74  const ::log4cxx::helpers::ClassRegistration& object##Registration = object::registerClass(); \
75  } }
76 
77 
78 #define IMPLEMENT_LOG4CXX_OBJECT_WITH_CUSTOM_CLASS(object, class)\
79  const log4cxx::helpers::Class& object::getClass() const { return getStaticClass(); }\
80  const log4cxx::helpers::Class& object::getStaticClass() { \
81  static class theClass; \
82  return theClass; \
83  } \
84  const log4cxx::helpers::ClassRegistration& object::registerClass() { \
85  static log4cxx::helpers::ClassRegistration classReg(object::getStaticClass); \
86  return classReg; \
87  }\
88  namespace log4cxx { namespace classes { \
89  const log4cxx::helpers::ClassRegistration& object##Registration = object::registerClass(); \
90  } }
91 
92 namespace log4cxx
93 {
94 class AppenderSkeleton;
95 class Logger;
96 
97 namespace helpers
98 {
99 class Pool;
100 
102 class LOG4CXX_EXPORT Object
103 {
104  public:
105  DECLARE_ABSTRACT_LOG4CXX_OBJECT(Object)
106  virtual ~Object() {}
107  virtual void addRef() const = 0;
108  virtual void releaseRef() const = 0;
109  virtual bool instanceof(const Class& clazz) const = 0;
110  virtual const void* cast(const Class& clazz) const = 0;
111 };
112 LOG4CXX_PTR_DEF(Object);
113 }
114 }
115 
116 #define BEGIN_LOG4CXX_CAST_MAP()\
117  const void * cast(const helpers::Class& clazz) const\
118  {\
119  const void * object = 0;\
120  if (&clazz == &helpers::Object::getStaticClass()) return (const helpers::Object *)this;
121 
122 #define END_LOG4CXX_CAST_MAP()\
123  return object;\
124  }\
125  bool instanceof(const helpers::Class& clazz) const\
126  { return cast(clazz) != 0; }
127 
128 #define LOG4CXX_CAST_ENTRY(Interface)\
129  if (&clazz == &Interface::getStaticClass()) return (const Interface *)this;
130 
131 #define LOG4CXX_CAST_ENTRY2(Interface, interface2)\
132  if (&clazz == &Interface::getStaticClass()) return (Interface *)(interface2 *)this;
133 
134 #define LOG4CXX_CAST_ENTRY_CHAIN(Interface)\
135  object = Interface::cast(clazz);\
136  if (object != 0) return object;
137 
138 #endif //_LOG4CXX_HELPERS_OBJECT_H
base class for java-like objects.
Definition: object.h:102
Definition: class.h:39
Definition: appender.h:33