![]() ![]() |
![]() |
1 mike 1.2 //%2006//////////////////////////////////////////////////////////////////////// 2 // 3 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development 4 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems. 5 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.; 6 // IBM Corp.; EMC Corporation, The Open Group. 7 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.; 8 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group. 9 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.; 10 // EMC Corporation; VERITAS Software Corporation; The Open Group. 11 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.; 12 // EMC Corporation; Symantec Corporation; The Open Group. 13 // 14 // Permission is hereby granted, free of charge, to any person obtaining a copy 15 // of this software and associated documentation files (the "Software"), to 16 // deal in the Software without restriction, including without limitation the 17 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 18 // sell copies of the Software, and to permit persons to whom the Software is 19 // furnished to do so, subject to the following conditions: 20 // 21 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN 22 mike 1.2 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED 23 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 24 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 25 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 26 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 27 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 29 // 30 //============================================================================== 31 // 32 //%///////////////////////////////////////////////////////////////////////////// 33 34 #ifndef Pegasus_Magic_h 35 #define Pegasus_Magic_h 36 37 #include <Pegasus/Common/Config.h> 38 39 PEGASUS_NAMESPACE_BEGIN 40 41 /** The Magic class implements a convenient way to use magic numbers in | ||
42 kumpf 1.3 user-defined classes. Magic numbers help detect use of uninitialized, | ||
43 mike 1.2 destructed, or corrupted objects. 44 | ||
45 kumpf 1.3 To instrument a class to use magic numbers simply add a class member | ||
46 mike 1.2 of type Magic<> as shown in thsi example: 47 | ||
48 kumpf 1.3 \code 49 class MyClass 50 { 51 public: | ||
52 mike 1.2 | ||
53 kumpf 1.3 MyClass(); | ||
54 mike 1.2 | ||
55 kumpf 1.3 ~MyClass(); | ||
56 mike 1.2 | ||
57 kumpf 1.3 void foo(); | ||
58 mike 1.2 | ||
59 kumpf 1.3 private: 60 Magic<0xC531B144> _magic; 61 }; 62 \endcode | ||
63 mike 1.2 64 Choose whatever number you like for a magic number. The number above was | ||
65 kumpf 1.3 generated by the Linux uuidgen utility (Windows has a utility with the | ||
66 mike 1.2 same name). 67 68 To test magic number, add the following expression wherever necessary 69 (usually as the first line of every member function). 70 | ||
71 kumpf 1.3 \code 72 PEGASUS_ASSERT_DEBUG(_magic); 73 \endcode | ||
74 mike 1.2 75 Here's a typical example: 76 | ||
77 kumpf 1.3 \code 78 MyClass::~MyClass() 79 { 80 PEGASUS_ASSERT_DEBUG(_magic); 81 } 82 \endcode | ||
83 mike 1.2 84 This tests whether the magic number is 0xC531B144 and asserts if it is 85 not. 86 87 Note that using a magic number makes the user-defined class 4 bytes larger 88 but there is no run-time overhead unless you compile with PEGASUS_DEBUG. 89 The Magic constructor and destructor are empty without PEGASUS_DEBUG and 90 are discarded by the compiler. 91 92 CAUTION: You may be tempted to compile out the magic member when 93 PEGASUS_DEBUG undefined. However, this will causes unpredictable 94 behavior when debug libraries are mixed with non-debug libraries. The 95 structure alignment and size will be different and will lead to crashes. 96 This is only safe if a class is internal to a library. 97 */ 98 template<Uint32 MAGIC_NUMBER> 99 class Magic 100 { 101 public: 102 103 /** Default constructor. Sets the magic number. 104 mike 1.2 */ | ||
105 kumpf 1.3 Magic() | ||
106 mike 1.2 { 107 #ifdef PEGASUS_DEBUG | ||
108 kumpf 1.3 _magic = MAGIC_NUMBER; | ||
109 mike 1.2 #endif 110 } 111 112 /** Destructor. Clears the magic number (with the pattern 0xDDDDDDDD). 113 */ | ||
114 kumpf 1.3 ~Magic() | ||
115 mike 1.2 { 116 #ifdef PEGASUS_DEBUG | ||
117 kumpf 1.3 _magic = 0xDDDDDDDD; | ||
118 mike 1.2 #endif 119 } 120 121 /** Allows magic number to be used as a boolean expression. This function | ||
122 kumpf 1.3 tests the magic number and return true if valid. | ||
123 mike 1.2 */ | ||
124 kumpf 1.3 operator bool() const 125 { | ||
126 mike 1.2 #ifdef PEGASUS_DEBUG | ||
127 kumpf 1.3 return _magic == MAGIC_NUMBER; | ||
128 mike 1.2 #else | ||
129 kumpf 1.3 return true; | ||
130 mike 1.2 #endif 131 } 132 133 private: 134 Uint32 _magic; 135 }; 136 137 PEGASUS_NAMESPACE_END 138 139 #endif /* Pegasus_Magic_h */ |
No CVS admin address has been configured |
Powered by ViewCVS 0.9.2 |