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