VTK
dox/Common/vtkVariantExtract.h
Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    vtkVariantExtract.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 __vtkVariantExtract_h
00023 #define __vtkVariantExtract_h
00024 
00025 
00026 // .SECTION Thanks
00027 // Developed by Timothy M. Shead (tshead@sandia.gov) at Sandia National Laboratories.
00028 
00029 // Description:
00030 // Performs an explicit conversion from a vtkVariant to the type that it contains.  Implicit
00031 // conversions are *not* performed, so casting a vtkVariant containing one type (e.g. double)
00032 // to a different type (e.g. string) will not convert between types.
00033 //
00034 // Callers should use the 'valid' flag to verify whether the extraction succeeded.
00035 template<typename T>
00036 T vtkVariantExtract(const vtkVariant& value, bool& valid = 0)
00037 {
00038   vtkGenericWarningMacro(
00039     << "Cannot convert vtkVariant containing [" << value.GetTypeAsString() << "] "
00040     << "to unsupported type [" << typeid(T).name() << "].  "
00041     << "Create a vtkVariantExtract<> specialization to eliminate this warning."
00042     );
00043 
00044   valid = false;
00045   
00046   static T dummy;
00047   return dummy;
00048 }
00049 
00050 template<>
00051 inline char vtkVariantExtract<char>(const vtkVariant& value, bool& valid)
00052 {
00053   valid = value.IsChar();
00054   return valid ? value.ToChar() : 0;
00055 }
00056 
00057 template<>
00058 inline unsigned char vtkVariantExtract<unsigned char>(const vtkVariant& value, bool& valid)
00059 {
00060   valid = value.IsUnsignedChar();
00061   return valid ? value.ToUnsignedChar() : 0;
00062 }
00063 
00064 template<>
00065 inline short vtkVariantExtract<short>(const vtkVariant& value, bool& valid)
00066 {
00067   valid = value.IsShort();
00068   return valid ? value.ToShort() : 0;
00069 }
00070 
00071 template<>
00072 inline unsigned short vtkVariantExtract<unsigned short>(const vtkVariant& value, bool& valid)
00073 {
00074   valid = value.IsUnsignedShort();
00075   return valid ? value.ToUnsignedShort() : 0;
00076 }
00077 
00078 template<>
00079 inline int vtkVariantExtract<int>(const vtkVariant& value, bool& valid)
00080 {
00081   valid = value.IsInt();
00082   return valid ? value.ToInt() : 0;
00083 }
00084 
00085 template<>
00086 inline unsigned int vtkVariantExtract<unsigned int>(const vtkVariant& value, bool& valid)
00087 {
00088   valid = value.IsUnsignedInt();
00089   return valid ? value.ToUnsignedInt() : 0;
00090 }
00091 
00092 template<>
00093 inline long vtkVariantExtract<long>(const vtkVariant& value, bool& valid)
00094 {
00095   valid = value.IsLong();
00096   return valid ? value.ToLong() : 0;
00097 }
00098 
00099 template<>
00100 inline unsigned long vtkVariantExtract<unsigned long>(const vtkVariant& value, bool& valid)
00101 {
00102   valid = value.IsUnsignedLong();
00103   return valid ? value.ToUnsignedLong() : 0;
00104 }
00105 
00106 #ifdef VTK_TYPE_USE___INT64
00107 
00108 template<>
00109 inline __int64 vtkVariantExtract<__int64>(const vtkVariant& value, bool& valid)
00110 {
00111   valid = value.Is__Int64();
00112   return valid ? value.To__Int64() : 0;
00113 }
00114 
00115 template<>
00116 inline unsigned __int64 vtkVariantExtract<unsigned __int64>(const vtkVariant& value, bool& valid)
00117 {
00118   valid = value.IsUnsigned__Int64();
00119   return valid ? value.ToUnsigned__Int64() : 0;
00120 }
00121 
00122 #endif
00123 
00124 
00125 #ifdef VTK_TYPE_USE_LONG_LONG
00126 
00127 template<>
00128 inline long long vtkVariantExtract<long long>(const vtkVariant& value, bool& valid)
00129 {
00130   valid = value.IsLongLong();
00131   return valid ? value.ToLongLong() : 0;
00132 }
00133 
00134 template<>
00135 inline unsigned long long vtkVariantExtract<unsigned long long>(const vtkVariant& value, bool& valid)
00136 {
00137   valid = value.IsUnsignedLongLong();
00138   return valid ? value.ToUnsignedLongLong() : 0;
00139 }
00140 
00141 #endif
00142 
00143 template<>
00144 inline float vtkVariantExtract<float>(const vtkVariant& value, bool& valid)
00145 {
00146   valid = value.IsFloat();
00147   return valid ? value.ToFloat() : 0.0f;
00148 }
00149 
00150 template<>
00151 inline double vtkVariantExtract<double>(const vtkVariant& value, bool& valid)
00152 {
00153   valid = value.IsDouble();
00154   return valid ? value.ToDouble() : 0.0;
00155 }
00156 
00157 template<>
00158 inline vtkStdString vtkVariantExtract<vtkStdString>(const vtkVariant& value, bool& valid)
00159 {
00160   valid = value.IsString();
00161   return valid ? value.ToString() : vtkStdString();
00162 }
00163 
00164 template<>
00165 inline vtkUnicodeString vtkVariantExtract<vtkUnicodeString>(const vtkVariant& value, bool& valid)
00166 {
00167   valid = value.IsUnicodeString();
00168   return valid ? value.ToUnicodeString() : vtkUnicodeString();
00169 }
00170 
00171 template<>
00172 inline vtkVariant vtkVariantExtract<vtkVariant>(const vtkVariant& value, bool& valid)
00173 {
00174   valid = true;
00175   return value;
00176 }
00177 
00178 #endif
00179