VTK
|
00001 /*========================================================================= 00002 00003 Program: Visualization Toolkit 00004 Module: vtkVariantCast.h 00005 00006 ------------------------------------------------------------------------- 00007 Copyright 2008 Sandia Corporation. 00008 Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, 00009 the U.S. Government retains certain rights in this software. 00010 ------------------------------------------------------------------------- 00011 00012 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen 00013 All rights reserved. 00014 See Copyright.txt or http://www.kitware.com/Copyright.htm for details. 00015 00016 This software is distributed WITHOUT ANY WARRANTY; without even 00017 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00018 PURPOSE. See the above copyright notice for more information. 00019 00020 =========================================================================*/ 00021 00022 #ifndef __vtkVariantCast_h 00023 #define __vtkVariantCast_h 00024 00025 #include <vtkUnicodeString.h> 00026 00027 // .SECTION Thanks 00028 // Developed by Timothy M. Shead (tshead@sandia.gov) at Sandia National Laboratories. 00029 00030 // Description: 00031 // Converts a vtkVariant to some other type. Wherever possible, implicit conversions are 00032 // performed, so this method can be used to convert from nearly any type to a string, or 00033 // from a string to nearly any type. Note that some conversions may fail at runtime, such 00034 // as a conversion from the string "abc" to a numeric type. 00035 // 00036 // The optional 'valid' flag can be used by callers to verify whether conversion succeeded. 00037 template<typename T> 00038 T vtkVariantCast(const vtkVariant& value, bool* valid = 0) 00039 { 00040 vtkGenericWarningMacro( 00041 << "Cannot convert vtkVariant containing [" << value.GetTypeAsString() << "] " 00042 << "to unsupported type [" << typeid(T).name() << "]. " 00043 << "Create a vtkVariantCast<> specialization to eliminate this warning." 00044 ); 00045 00046 if(valid) 00047 *valid = false; 00048 00049 static T dummy; 00050 return dummy; 00051 } 00052 00053 template<> 00054 inline char vtkVariantCast<char>(const vtkVariant& value, bool* valid) 00055 { 00056 return value.ToChar(valid); 00057 } 00058 00059 template<> 00060 inline unsigned char vtkVariantCast<unsigned char>(const vtkVariant& value, bool* valid) 00061 { 00062 return value.ToUnsignedChar(valid); 00063 } 00064 00065 template<> 00066 inline short vtkVariantCast<short>(const vtkVariant& value, bool* valid) 00067 { 00068 return value.ToShort(valid); 00069 } 00070 00071 template<> 00072 inline unsigned short vtkVariantCast<unsigned short>(const vtkVariant& value, bool* valid) 00073 { 00074 return value.ToUnsignedShort(valid); 00075 } 00076 00077 template<> 00078 inline int vtkVariantCast<int>(const vtkVariant& value, bool* valid) 00079 { 00080 return value.ToInt(valid); 00081 } 00082 00083 template<> 00084 inline unsigned int vtkVariantCast<unsigned int>(const vtkVariant& value, bool* valid) 00085 { 00086 return value.ToUnsignedInt(valid); 00087 } 00088 00089 template<> 00090 inline long vtkVariantCast<long>(const vtkVariant& value, bool* valid) 00091 { 00092 return value.ToLong(valid); 00093 } 00094 00095 template<> 00096 inline unsigned long vtkVariantCast<unsigned long>(const vtkVariant& value, bool* valid) 00097 { 00098 return value.ToUnsignedLong(valid); 00099 } 00100 00101 #ifdef VTK_TYPE_USE___INT64 00102 00103 template<> 00104 inline __int64 vtkVariantCast<__int64>(const vtkVariant& value, bool* valid) 00105 { 00106 return value.To__Int64(valid); 00107 } 00108 00109 template<> 00110 inline unsigned __int64 vtkVariantCast<unsigned __int64>(const vtkVariant& value, bool* valid) 00111 { 00112 return value.ToUnsigned__Int64(valid); 00113 } 00114 00115 #endif 00116 00117 00118 #ifdef VTK_TYPE_USE_LONG_LONG 00119 00120 template<> 00121 inline long long vtkVariantCast<long long>(const vtkVariant& value, bool* valid) 00122 { 00123 return value.ToLongLong(valid); 00124 } 00125 00126 template<> 00127 inline unsigned long long vtkVariantCast<unsigned long long>(const vtkVariant& value, bool* valid) 00128 { 00129 return value.ToUnsignedLongLong(valid); 00130 } 00131 00132 #endif 00133 00134 template<> 00135 inline float vtkVariantCast<float>(const vtkVariant& value, bool* valid) 00136 { 00137 return value.ToFloat(valid); 00138 } 00139 00140 template<> 00141 inline double vtkVariantCast<double>(const vtkVariant& value, bool* valid) 00142 { 00143 return value.ToDouble(valid); 00144 } 00145 00146 template<> 00147 inline vtkStdString vtkVariantCast<vtkStdString>(const vtkVariant& value, bool* valid) 00148 { 00149 if(valid) 00150 *valid = true; 00151 00152 return value.ToString(); 00153 } 00154 00155 template<> 00156 inline vtkUnicodeString vtkVariantCast<vtkUnicodeString>(const vtkVariant& value, bool* valid) 00157 { 00158 if(valid) 00159 *valid = true; 00160 00161 return value.ToUnicodeString(); 00162 } 00163 00164 template<> 00165 inline vtkVariant vtkVariantCast<vtkVariant>(const vtkVariant& value, bool* valid) 00166 { 00167 if(valid) 00168 *valid = true; 00169 00170 return value; 00171 } 00172 00173 #endif 00174