type_traits.h revision 551ccae044b0ff658fe629dd67edd5ffe75d10e8
1551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer//===- llvm/Support/type_traits.h - Simplfied type traits -------*- C++ -*-===// 25c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner// 35c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner// The LLVM Compiler Infrastructure 45c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner// 55c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner// This file was developed by the LLVM research group and is distributed under 65c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner// the University of Illinois Open Source License. See LICENSE.TXT for details. 75c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner// 85c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner//===----------------------------------------------------------------------===// 95c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner// 105c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner// This file provides a template class that determines if a type is a class or 115c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner// not. The basic mechanism, based on using the pointer to member function of 125c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner// a zero argument to a function was "boosted" from the boost type_traits 135c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner// library. See http://www.boost.org/ for all the gory details. 145c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner// 155c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner//===----------------------------------------------------------------------===// 165c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner 175c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner#ifndef LLVM_SUPPORT_TYPE_TRAITS_H 185c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner#define LLVM_SUPPORT_TYPE_TRAITS_H 195c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner 205c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner// This is actually the conforming implementation which works with abstract 215c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner// classes. However, enough compilers have trouble with it that most will use 225c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner// the one in boost/type_traits/object_traits.hpp. This implementation actually 235c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner// works with VC7.0, but other interactions seem to fail when we use it. 245c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner 255c4d53a4d1bce60051fd71af1791791acb2000daChris Lattnernamespace llvm { 265c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner 275c4d53a4d1bce60051fd71af1791791acb2000daChris Lattnernamespace dont_use 285c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner{ 295c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner // These two functions should never be used. They are helpers to 305c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner // the is_class template below. They cannot be located inside 315c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner // is_class because doing so causes at least GCC to think that 325c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner // the value of the "value" enumerator is not constant. Placing 335c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner // them out here (for some strange reason) allows the sizeof 345c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner // operator against them to magically be constant. This is 355c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner // important to make the is_class<T>::value idiom zero cost. it 365c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner // evaluates to a constant 1 or 0 depending on whether the 375c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner // parameter T is a class or not (respectively). 385c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner template<typename T> char is_class_helper(void(T::*)(void)); 395c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner template<typename T> double is_class_helper(...); 405c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner} 415c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner 425c4d53a4d1bce60051fd71af1791791acb2000daChris Lattnertemplate <typename T> 435c4d53a4d1bce60051fd71af1791791acb2000daChris Lattnerstruct is_class 445c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner{ 455c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner // is_class<> metafunction due to Paul Mensonides (leavings@attbi.com). For 465c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner // more details: 475c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner // http://groups.google.com/groups?hl=en&selm=000001c1cc83%24e154d5e0%247772e50c%40c161550a&rnum=1 485c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner public: 495c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner enum { value = sizeof(char) == sizeof(dont_use::is_class_helper<T>(0)) }; 505c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner}; 515c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner 525c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner} 535c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner 545c4d53a4d1bce60051fd71af1791791acb2000daChris Lattner#endif 55