]> Dogcows Code - chaz/yoink/blobdiff - src/stlplus/containers/containers_fixes.hpp
import stlplus 3.7
[chaz/yoink] / src / stlplus / containers / containers_fixes.hpp
index f244323d279427e2094be08fb88702451276f641..75ceb1d4a9c4fdaf39ca38f9119826a2e8116ad4 100644 (file)
-#ifndef STLPLUS_CONTAINERS_FIXES
-#define STLPLUS_CONTAINERS_FIXES
-////////////////////////////////////////////////////////////////////////////////
-
-//   Author:    Andy Rushton
-//   Copyright: (c) Southampton University 1999-2004
-//              (c) Andy Rushton           2004-2009
-//   License:   BSD License, see ../docs/license.html
-
-//   Contains work arounds for OS or Compiler specific problems with container
-//   templates
-
-////////////////////////////////////////////////////////////////////////////////
-
-////////////////////////////////////////////////////////////////////////////////
-// Unnecessary compiler warnings
-////////////////////////////////////////////////////////////////////////////////
-
-#ifdef _MSC_VER
-// Microsoft Visual Studio
-// shut up the following irritating warnings
-//   4786 - VC6, identifier string exceeded maximum allowable length and was truncated (only affects debugger)
-//   4305 - VC6, identifier type was converted to a smaller type
-//   4503 - VC6, decorated name was longer than the maximum the compiler allows (only affects debugger)
-//   4309 - VC6, type conversion operation caused a constant to exceeded the space allocated for it
-//   4290 - VC6, C++ exception specification ignored
-//   4800 - VC6, forcing value to bool 'true' or 'false' (performance warning)
-//   4355 - VC6, 'this' : used in base member initializer list
-//   4675 - VC7.1, "change" in function overload resolution _might_ have altered program
-//   4996 - VC8, 'xxxx' was declared deprecated
-#pragma warning(disable: 4786 4305 4503 4309 4290 4800 4355 4675 4996)
-#endif
-
-#ifdef __BORLANDC__
-// Borland
-// Shut up the following irritating warnings
-//   8026 - Functions with exception specifications are not expanded inline
-//   8027 - Functions with xxx are not expanded inline
-#pragma warn -8026
-#pragma warn -8027
-#endif
-
-////////////////////////////////////////////////////////////////////////////////
-// Problems with the typename keyword
-////////////////////////////////////////////////////////////////////////////////
-
-// There are problems with using the 'typename' keyword. Technically, if you
-// use a type member of a template class (i.e. a type declared within the
-// template class by a local typedef), you need to tell the compiler that it
-// is a type name. This is because the compiler cannot work out whether a
-// member is a type, a method or a data field at compile time. However,
-// support for the typename keyword has traditionally been incomplete in both
-// gcc and Visual Studio. I have used macros to try to resolve this issue. The
-// macros add the keyword for compiler versions that require it and omit it
-// for compiler versions that do not support it
-
-// There are five places where typename keywords cause problems:
-//
-//   1) in a typedef where a template class's member type is being mapped onto
-//      a type definition within another template class or function 
-//      e.g. template<typename T> fn () {
-//             typedef typename someclass<T>::member_type local_type;
-//                     ^^^^^^^^
-//   2) in a function parameter declaration, with similar rules to the above
-//      e.g. template<typename T> fn (typename someclass<T>::member_type)
-//                                    ^^^^^^^^
-//   3) in instantiating a template, the parameter to the template, with similar rules to the above
-//      e.g. template_class<typename someclass<T>::member_type>
-//                          ^^^^^^^^
-//   4) Return expressions
-//      e.g. return typename ntree<T>::const_iterator(this,m_root);
-//                  ^^^^^^^^
-//   5) Creating temporary objects when passing arguments to a function or constructor
-//      e.g. return typename ntree<T>::const_prefix_iterator(typename ntree<T>::const_iterator(this,m_root));
-//                                                           ^^^^^^^^
-// Note that the typename keyword is only required when the type being referred to is a member of a template class
-//
-// So far it *seems* as if all compilers either require all of them or none of
-// them, so this set of situations can be handled by a single macro
-
-// default values, overridden for individual problem cases below
-#define TYPENAME typename
-
-// GCC 
-//   - pre-version 3 didn't handle typename in any of these cases
-//   - version 3 onwards, typename is required for all three cases as per default
-#ifdef __GNUC__
-#if __GNUC__ < 3
-#undef TYPENAME
-#define TYPENAME
-#endif
-#endif
-
-// Visual Studio
-//   - version 6 (compiler v.12) cannot handle typename in any of these cases
-//   - version 7 (.NET) (compiler v.13) requires a typename in a parameter specification but supports all
-//   - version 8 (2005) (compiler v.14) requires parameters and templates, supports all
-#ifdef _MSC_VER
-#if _MSC_VER <= 1200
-#undef TYPENAME
-#define TYPENAME
-#endif
-#endif
-
-// Borland 
-//   - doesn't handle typename in 5.5, does in 5.82, not sure about other cases
-#ifdef __BORLANDC__
-#if __BORLANDC__ <= 0x550
-#undef TYPENAME
-#define TYPENAME
-#endif
-#endif
-
-////////////////////////////////////////////////////////////////////////////////
-// Member templates
-// e.g. a template function in a template class
-
-// Not all compilers support them - this fix can be used to disable member
-// templates for compilers that don't. Unfortunately that means that some
-// functionality will be missing for those compilers.
-
-#define STLPLUS_MEMBER_TEMPLATES
-
-// Visual Studio v6 (compiler version 12) does not support them
-#ifdef _MSC_VER
-#if _MSC_VER <= 1200
-#undef STLPLUS_MEMBER_TEMPLATES
-#endif
-#endif
-
-////////////////////////////////////////////////////////////////////////////////
-#endif
+#ifndef STLPLUS_CONTAINERS_FIXES\r
+#define STLPLUS_CONTAINERS_FIXES\r
+////////////////////////////////////////////////////////////////////////////////\r
+\r
+//   Author:    Andy Rushton\r
+//   Copyright: (c) Southampton University 1999-2004\r
+//              (c) Andy Rushton           2004 onwards\r
+//   License:   BSD License, see ../docs/license.html\r
+\r
+//   Contains work arounds for OS or Compiler specific problems with container\r
+//   templates\r
+\r
+////////////////////////////////////////////////////////////////////////////////\r
+\r
+////////////////////////////////////////////////////////////////////////////////\r
+// Unnecessary compiler warnings\r
+////////////////////////////////////////////////////////////////////////////////\r
+\r
+#ifdef _MSC_VER\r
+// Microsoft Visual Studio\r
+// shut up the following irritating warnings\r
+//   4786 - VC6, identifier string exceeded maximum allowable length and was truncated (only affects debugger)\r
+//   4305 - VC6, identifier type was converted to a smaller type\r
+//   4503 - VC6, decorated name was longer than the maximum the compiler allows (only affects debugger)\r
+//   4309 - VC6, type conversion operation caused a constant to exceeded the space allocated for it\r
+//   4290 - VC6, C++ exception specification ignored\r
+//   4800 - VC6, forcing value to bool 'true' or 'false' (performance warning)\r
+//   4355 - VC6, 'this' : used in base member initializer list\r
+//   4675 - VC7.1, "change" in function overload resolution _might_ have altered program\r
+//   4996 - VC8, 'xxxx' was declared deprecated\r
+#pragma warning(disable: 4786 4305 4503 4309 4290 4800 4355 4675 4996)\r
+#endif\r
+\r
+#ifdef __BORLANDC__\r
+// Borland\r
+// Shut up the following irritating warnings\r
+//   8026 - Functions with exception specifications are not expanded inline\r
+//   8027 - Functions with xxx are not expanded inline\r
+#pragma warn -8026\r
+#pragma warn -8027\r
+#endif\r
+\r
+////////////////////////////////////////////////////////////////////////////////\r
+// Problems with the typename keyword\r
+////////////////////////////////////////////////////////////////////////////////\r
+\r
+// There are problems with using the 'typename' keyword. Technically, if you\r
+// use a type member of a template class (i.e. a type declared within the\r
+// template class by a local typedef), you need to tell the compiler that it\r
+// is a type name. This is because the compiler cannot work out whether a\r
+// member is a type, a method or a data field at compile time. However,\r
+// support for the typename keyword has traditionally been incomplete in both\r
+// gcc and Visual Studio. I have used macros to try to resolve this issue. The\r
+// macros add the keyword for compiler versions that require it and omit it\r
+// for compiler versions that do not support it\r
+\r
+// There are five places where typename keywords cause problems:\r
+//\r
+//   1) in a typedef where a template class's member type is being mapped onto\r
+//      a type definition within another template class or function \r
+//      e.g. template<typename T> fn () {\r
+//             typedef typename someclass<T>::member_type local_type;\r
+//                     ^^^^^^^^\r
+//   2) in a function parameter declaration, with similar rules to the above\r
+//      e.g. template<typename T> fn (typename someclass<T>::member_type)\r
+//                                    ^^^^^^^^\r
+//   3) in instantiating a template, the parameter to the template, with similar rules to the above\r
+//      e.g. template_class<typename someclass<T>::member_type>\r
+//                          ^^^^^^^^\r
+//   4) Return expressions\r
+//      e.g. return typename ntree<T>::const_iterator(this,m_root);\r
+//                  ^^^^^^^^\r
+//   5) Creating temporary objects when passing arguments to a function or constructor\r
+//      e.g. return typename ntree<T>::const_prefix_iterator(typename ntree<T>::const_iterator(this,m_root));\r
+//                                                           ^^^^^^^^\r
+// Note that the typename keyword is only required when the type being referred to is a member of a template class\r
+//\r
+// So far it *seems* as if all compilers either require all of them or none of\r
+// them, so this set of situations can be handled by a single macro\r
+\r
+// default values, overridden for individual problem cases below\r
+#define TYPENAME typename\r
+\r
+// GCC \r
+//   - pre-version 3 didn't handle typename in any of these cases\r
+//   - version 3 onwards, typename is required for all three cases as per default\r
+#ifdef __GNUC__\r
+#if __GNUC__ < 3\r
+#undef TYPENAME\r
+#define TYPENAME\r
+#endif\r
+#endif\r
+\r
+// Visual Studio\r
+//   - version 6 (compiler v.12) cannot handle typename in any of these cases\r
+//   - version 7 (.NET) (compiler v.13) requires a typename in a parameter specification but supports all\r
+//   - version 8 (2005) (compiler v.14) requires parameters and templates, supports all\r
+#ifdef _MSC_VER\r
+#if _MSC_VER <= 1200\r
+#undef TYPENAME\r
+#define TYPENAME\r
+#endif\r
+#endif\r
+\r
+// Borland \r
+//   - doesn't handle typename in 5.5, does in 5.82, not sure about other cases\r
+#ifdef __BORLANDC__\r
+#if __BORLANDC__ <= 0x550\r
+#undef TYPENAME\r
+#define TYPENAME\r
+#endif\r
+#endif\r
+\r
+////////////////////////////////////////////////////////////////////////////////\r
+// Member templates\r
+// e.g. a template function in a template class\r
+\r
+// Not all compilers support them - this fix can be used to disable member\r
+// templates for compilers that don't. Unfortunately that means that some\r
+// functionality will be missing for those compilers.\r
+\r
+#define STLPLUS_MEMBER_TEMPLATES\r
+\r
+// Visual Studio v6 (compiler version 12) does not support them\r
+#ifdef _MSC_VER\r
+#if _MSC_VER <= 1200\r
+#undef STLPLUS_MEMBER_TEMPLATES\r
+#endif\r
+#endif\r
+\r
+////////////////////////////////////////////////////////////////////////////////\r
+#endif\r
This page took 0.028283 seconds and 4 git commands to generate.