STLSoft - ... Robust, Lightweight, Cross-platform, Template Software ... ATLSTL - Template Software for the Active Template Library COMSTL - The Standard Template Library meets the Component Object Model .netSTL - Standard Template Library meets the Microsoft.NET Common Language Runtime InetSTL - The Standard Template Library meets WinInet MFCSTL - Template Software for the Microsoft Foundation Classes UNIXSTL - Template Software for the UNIX Operating System WinSTL - where the Standard Template Library meets the Win32 API

Main Page   Modules   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

stlsoft_operator_bool.h

Go to the documentation of this file.
00001 /* 
00002  * File:        stlsoft_operator_bool.h
00003  *
00004  * Purpose:     A robust and portable operator bool generator class.
00005  *
00006  * Created:     5th November 2003
00007  * Updated:     11th September 2004
00008  *
00009  * Home:        http://stlsoft.org/
00010  *
00011  * Copyright (c) 2003-2004, Matthew Wilson and Synesis Software
00012  * All rights reserved.
00013  *
00014  * Redistribution and use in source and binary forms, with or without
00015  * modification, are permitted provided that the following conditions are met:
00016  *
00017  * - Redistributions of source code must retain the above copyright notice, this
00018  *   list of conditions and the following disclaimer.
00019  * - Redistributions in binary form must reproduce the above copyright notice,
00020  *   this list of conditions and the following disclaimer in the documentation
00021  *   and/or other materials provided with the distribution.
00022  * - Neither the name(s) of Matthew Wilson and Synesis Software nor the names of
00023  *   any contributors may be used to endorse or promote products derived from
00024  *   this software without specific prior written permission.
00025  *
00026  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00027  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00028  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00029  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
00030  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00031  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00032  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00033  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00034  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00035  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00036  * POSSIBILITY OF SUCH DAMAGE.
00037  *
00038  * 
00039 
00040 
00044 
00045 #ifndef STLSOFT_INCL_H_STLSOFT_OPERATOR_BOOL
00046 #define STLSOFT_INCL_H_STLSOFT_OPERATOR_BOOL
00047 
00048 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00049 # define STLSOFT_VER_H_STLSOFT_OPERATOR_BOOL_MAJOR      2
00050 # define STLSOFT_VER_H_STLSOFT_OPERATOR_BOOL_MINOR      0
00051 # define STLSOFT_VER_H_STLSOFT_OPERATOR_BOOL_REVISION   1
00052 # define STLSOFT_VER_H_STLSOFT_OPERATOR_BOOL_EDIT       19
00053 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00054 
00055 /* 
00056  * Includes
00057  */
00058 
00059 #ifndef STLSOFT_INCL_H_STLSOFT
00060 # include "stlsoft.h"   // Include the STLSoft root header
00061 #endif /* !STLSOFT_INCL_H_STLSOFT */
00062 
00063 /* 
00064  * Namespace
00065  */
00066 
00067 #ifndef _STLSOFT_NO_NAMESPACE
00068 namespace stlsoft
00069 {
00070 #endif /* _STLSOFT_NO_NAMESPACE */
00071 
00072 /* 
00073  * Macros
00074  */
00075 
00084 
00085 # define STLSOFT_DEFINE_OPERATOR_BOOL_TYPES(U, G, B)                                                \
00086                                                                                                     \
00087     typedef stlsoft_ns_qual(operator_bool_generator)<U>::class_type   G;                            \
00088     typedef G::return_type                                            B
00089 
00101 
00102 #if defined(__STLSOFT_COMPILER_IS_BORLAND) || \
00103     (   defined(__STLSOFT_COMPILER_IS_MSVC) && \
00104         _MSC_VER < 1300)
00105 
00106 # define STLSOFT_DEFINE_OPERATOR_BOOL_TYPES_T(U, G, B)                                              \
00107                                                                                                     \
00108     STLSOFT_DEFINE_OPERATOR_BOOL_TYPES(U, G, B)
00109 
00110 #else /* ? compiler */
00111 
00112 # define STLSOFT_DEFINE_OPERATOR_BOOL_TYPES_T(U, G, B)                                              \
00113                                                                                                     \
00114     typedef ss_typename_param_k stlsoft_ns_qual(operator_bool_generator)<U>::class_type G;          \
00115     typedef ss_typename_param_k G::return_type                                          B
00116 
00117 #endif /* compiler */
00118 
00119 /* 
00120  * Classes
00121  */
00122 
00125 template <ss_typename_param_k T>
00126 struct operator_bool_generator
00127 {
00128 public:
00129     typedef operator_bool_generator<T>  class_type;
00130 
00131 #ifdef STLSOFT_CF_OPERATOR_BOOL_AS_OPERATOR_POINTER_TO_MEMBER_SUPPORT
00132     typedef int class_type::*return_type;
00133 
00135     static return_type true_value()
00136     {
00137         return &class_type::i;
00138     }
00139 
00140 private:
00141     int i;
00142 public:
00143 #else
00144     typedef class_type const  *return_type;
00145 
00147     static return_type true_value()
00148     {
00149         class_type  t;
00150         void        *p = static_cast<void*>(&t);
00151 
00152         return static_cast<return_type>(p);
00153     }
00154 #endif // STLSOFT_CF_OPERATOR_BOOL_AS_OPERATOR_POINTER_TO_MEMBER_SUPPORT
00155 
00157     static return_type false_value()
00158     {
00159         return static_cast<return_type>(0);
00160     }
00161 
00163 #ifdef __STLSOFT_CF_MEMBER_TEMPLATE_FUNCTION_SUPPORT
00164     template <ss_typename_param_k U>
00165     static return_type translate(U b)
00166 #else /* ? __STLSOFT_CF_MEMBER_TEMPLATE_FUNCTION_SUPPORT */
00167     static return_type translate(ss_bool_t b)
00168 #endif // __STLSOFT_CF_MEMBER_TEMPLATE_FUNCTION_SUPPORT
00169     {
00170         return b ? true_value() : false_value();
00171     }
00172 
00173 private:
00174     void operator delete(void*);
00175 };
00176 
00177 /* 
00178 
00179 #ifndef _STLSOFT_NO_NAMESPACE
00180 } // namespace stlsoft
00181 #endif /* _STLSOFT_NO_NAMESPACE */
00182 
00183 /* 
00184 
00185 #endif /* !STLSOFT_INCL_H_STLSOFT_OPERATOR_BOOL */
00186 
00187 /* 

STLSoft Libraries documentation © Synesis Software Pty Ltd, 2001-2004