API Documentation
00001 // Module: Log4CPLUS 00002 // File: ndc.h 00003 // Created: 6/2001 00004 // Author: Tad E. Smith 00005 // 00006 // 00007 // Copyright (C) Tad E. Smith All rights reserved. 00008 // 00009 // This software is published under the terms of the Apache Software 00010 // License version 1.1, a copy of which has been included with this 00011 // distribution in the LICENSE.APL file. 00012 // 00013 00018 #ifndef _LO4CPLUS_NDC_HEADER_ 00019 #define _LO4CPLUS_NDC_HEADER_ 00020 00021 #include <log4cplus/config.h> 00022 #include <log4cplus/tstring.h> 00023 #include <log4cplus/helpers/logloguser.h> 00024 #include <log4cplus/helpers/threads.h> 00025 00026 #include <map> 00027 #include <stack> 00028 00029 #if (defined(__MWERKS__) && defined(__MACOS__)) 00030 using std::size_t; 00031 #endif 00032 00033 00034 namespace log4cplus { 00035 // Forward declarations 00036 class NDC; 00037 struct DiagnosticContext; 00038 typedef std::stack<DiagnosticContext> DiagnosticContextStack; 00039 00043 LOG4CPLUS_EXPORT NDC& getNDC(); 00044 00109 class LOG4CPLUS_EXPORT NDC : protected log4cplus::helpers::LogLogUser { 00110 public: 00119 void clear(); 00120 00134 DiagnosticContextStack cloneStack(); 00135 00150 void inherit(const DiagnosticContextStack& stack); 00151 00155 log4cplus::tstring get(); 00156 00162 size_t getDepth(); 00163 00175 log4cplus::tstring pop(); 00176 00186 log4cplus::tstring peek(); 00187 00198 void push(const log4cplus::tstring& message); 00199 00207 void remove(); 00208 00239 void setMaxDepth(size_t maxDepth); 00240 00241 // Dtor 00242 ~NDC(); 00243 00244 private: 00245 // Methods 00246 DiagnosticContextStack* getPtr() 00247 { return static_cast<DiagnosticContextStack*> 00248 (LOG4CPLUS_GET_THREAD_LOCAL_VALUE( threadLocal )); } 00249 00250 // Data 00251 LOG4CPLUS_THREAD_LOCAL_TYPE threadLocal; 00252 00253 // Disallow construction (and copying) except by getNDC() 00254 NDC(); 00255 NDC(const NDC&); 00256 NDC& operator=(const NDC&); 00257 00258 // Friends 00259 friend LOG4CPLUS_EXPORT NDC& getNDC(); 00260 }; 00261 00262 00263 00267 struct LOG4CPLUS_EXPORT DiagnosticContext { 00268 // Ctors 00269 DiagnosticContext(const log4cplus::tstring& message, DiagnosticContext *parent); 00270 DiagnosticContext(const log4cplus::tstring& message); 00271 00272 // Data 00273 log4cplus::tstring message; 00274 log4cplus::tstring fullMessage; 00275 }; 00276 00277 00282 class LOG4CPLUS_EXPORT NDCContextCreator { 00283 public: 00285 NDCContextCreator(const log4cplus::tstring& msg) { getNDC().push(msg); } 00286 00288 ~NDCContextCreator() { getNDC().pop(); } 00289 }; 00290 00291 } // end namespace log4cplus 00292 00293 00294 #endif // _LO4CPLUS_NDC_HEADER_