00001 /*!@file Util/TypeTraits.H Template approach to getting compile-time 00002 information about types.*/ 00003 00004 // //////////////////////////////////////////////////////////////////// // 00005 // The iLab Neuromorphic Vision C++ Toolkit - Copyright (C) 2001 by the // 00006 // University of Southern California (USC) and the iLab at USC. // 00007 // See http://iLab.usc.edu for information about this project. // 00008 // //////////////////////////////////////////////////////////////////// // 00009 // Major portions of the iLab Neuromorphic Vision Toolkit are protected // 00010 // under the U.S. patent ``Computation of Intrinsic Perceptual Saliency // 00011 // in Visual Environments, and Applications'' by Christof Koch and // 00012 // Laurent Itti, California Institute of Technology, 2001 (patent // 00013 // pending; application number 09/912,225 filed July 23, 2001; see // 00014 // http://pair.uspto.gov/cgi-bin/final/home.pl for current status). // 00015 // //////////////////////////////////////////////////////////////////// // 00016 // This file is part of the iLab Neuromorphic Vision C++ Toolkit. // 00017 // // 00018 // The iLab Neuromorphic Vision C++ Toolkit is free software; you can // 00019 // redistribute it and/or modify it under the terms of the GNU General // 00020 // Public License as published by the Free Software Foundation; either // 00021 // version 2 of the License, or (at your option) any later version. // 00022 // // 00023 // The iLab Neuromorphic Vision C++ Toolkit is distributed in the hope // 00024 // that it will be useful, but WITHOUT ANY WARRANTY; without even the // 00025 // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // 00026 // PURPOSE. See the GNU General Public License for more details. // 00027 // // 00028 // You should have received a copy of the GNU General Public License // 00029 // along with the iLab Neuromorphic Vision C++ Toolkit; if not, write // 00030 // to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, // 00031 // Boston, MA 02111-1307 USA. // 00032 // //////////////////////////////////////////////////////////////////// // 00033 // 00034 // Primary maintainer for this file: Rob Peters <rjpeters@klab.caltech.edu> 00035 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/Util/TypeTraits.H $ 00036 // $Id: TypeTraits.H 4663 2005-06-23 17:47:28Z rjpeters $ 00037 // 00038 00039 #ifndef TYPETRAITS_H_DEFINED 00040 #define TYPETRAITS_H_DEFINED 00041 00042 //! The generic TypeTraits implementation. 00043 /*! This template struct can be specialized or partially specialized 00044 for other user-defined types. In general, the approach should be 00045 that the generic version makes the most conservative 00046 specifications, and that specializations can make more aggressive 00047 specifications. That way, if we forget to specialize for a given 00048 type, we might risk missing some optimization, but won't risk 00049 breaking the program. */ 00050 template <class T> 00051 struct TypeTraits 00052 { 00053 //! Whether the type is trivial (either builtin or a plain-old-data struct). 00054 /*! This will be used to determine whether objects of the type can 00055 safely be handled as raw memory; that is, whether they can be 00056 initialized with memset(), copied with memcpy(), and don't have 00057 to have their destructors run, etc. Any of the builtin types 00058 meet these criteria, as well as any user-defined plain-old-data 00059 (POD) type. A POD type must have members that are all either 00060 builtin types or other POD types, and must not have a 00061 user-defined destqructor, copy constructor, or assignment 00062 operator. It <b>can</b> have user-defined constructors. */ 00063 enum { isTrivial = 0 }; 00064 }; 00065 00066 template <> struct TypeTraits<bool> { enum { isTrivial = 1 }; }; 00067 00068 template <> struct TypeTraits<char> { enum { isTrivial = 1 }; }; 00069 template <> struct TypeTraits<unsigned char> { enum { isTrivial = 1 }; }; 00070 template <> struct TypeTraits<short> { enum { isTrivial = 1 }; }; 00071 template <> struct TypeTraits<unsigned short> { enum { isTrivial = 1 }; }; 00072 template <> struct TypeTraits<int> { enum { isTrivial = 1 }; }; 00073 template <> struct TypeTraits<unsigned int> { enum { isTrivial = 1 }; }; 00074 template <> struct TypeTraits<long> { enum { isTrivial = 1 }; }; 00075 template <> struct TypeTraits<unsigned long> { enum { isTrivial = 1 }; }; 00076 00077 template <> struct TypeTraits<float> { enum { isTrivial = 1 }; }; 00078 template <> struct TypeTraits<double> { enum { isTrivial = 1 }; }; 00079 template <> struct TypeTraits<long double> { enum { isTrivial = 1 }; }; 00080 00081 // ###################################################################### 00082 /* So things look consistent in everyone's emacs... */ 00083 /* Local Variables: */ 00084 /* indent-tabs-mode: nil */ 00085 /* End: */ 00086 00087 #endif // !TYPETRAITS_H_DEFINED