incubator-stdcxx-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Eric Lemings" <Eric.Lemi...@roguewave.com>
Subject RE: svn commit: r664141 - in /stdcxx/branches/4.3.x: include/type_traits tests/utilities/20.meta.help.cpp
Date Fri, 06 Jun 2008 23:16:51 GMT
 
I was wondering if it wouldn't make more sense to move just
the integral_constant class template to its own header?  If
I just need that class template, I wouldn't want to have to
pull in all the other type traits as well.

Maybe under include/rw/_integral_constant.h?

Brad.

> -----Original Message-----
> From: vitek@apache.org [mailto:vitek@apache.org] 
> Sent: Friday, June 06, 2008 3:44 PM
> To: commits@stdcxx.apache.org
> Subject: svn commit: r664141 - in /stdcxx/branches/4.3.x: 
> include/type_traits tests/utilities/20.meta.help.cpp
> 
> Author: vitek
> Date: Fri Jun  6 14:44:17 2008
> New Revision: 664141
> 
> URL: http://svn.apache.org/viewvc?rev=664141&view=rev
> Log:
> 2008-06-06  Travis Vitek  <vitek@roguewave.com>
> 
> 	STDCXX-917
> 	* include/type_traits: Add type_traits header that
> 	includes integral_contstant<> implementation.
> 	* tests/utilities/20.meta.help.cpp: Add new test.
> 	
> 
> Added:
>     stdcxx/branches/4.3.x/include/type_traits   (with props)
>     stdcxx/branches/4.3.x/tests/utilities/20.meta.help.cpp   
> (with props)
> 
> Added: stdcxx/branches/4.3.x/include/type_traits
> URL: 
> http://svn.apache.org/viewvc/stdcxx/branches/4.3.x/include/typ
> e_traits?rev=664141&view=auto
> ==============================================================
> ================
> --- stdcxx/branches/4.3.x/include/type_traits (added)
> +++ stdcxx/branches/4.3.x/include/type_traits Fri Jun  6 14:44:17 2008
> @@ -0,0 +1,86 @@
> +	// -*- C++ -*-
> +/************************************************************
> ***************
> + *
> + * type_traits - definition of type_traits types
> + *
> + * $Id$
> + *
> + 
> **************************************************************
> *************
> + *
> + * Licensed to the Apache Software  Foundation (ASF) under 
> one or more
> + * contributor  license agreements.  See  the NOTICE  file 
> distributed
> + * with  this  work  for  additional information  regarding  
> copyright
> + * ownership.   The ASF  licenses this  file to  you under  
> the Apache
> + * License, Version  2.0 (the  "License"); you may  not use  
> this file
> + * except in  compliance with the License.   You may obtain  
> a copy of
> + * the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in 
> writing, software
> + * distributed under the  License is distributed on an  "AS 
> IS" BASIS,
> + * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  
> express or
> + * implied.   See  the License  for  the  specific language  
> governing
> + * permissions and limitations under the License.
> + *
> + * Copyright 2008 Rogue Wave Software, Inc.
> + * 
> + 
> **************************************************************
> ************/
> +
> +#ifndef _RWSTD_TYPE_TRAITS_INCLUDED
> +#define _RWSTD_TYPE_TRAITS_INCLUDED
> +
> +#include <rw/_defs.h>
> +
> +#ifndef _RWSTD_NO_EXT_CXX_0X
> +
> +_RWSTD_NAMESPACE (std) {
> +
> +/**
> + * The class template integral_constant and its associated typedefs
> + * true_type and false_type are used as base classes to define the
> + * interface for various type traits.
> + */
> +template <class _TypeT, _TypeT _Value>
> +struct integral_constant
> +{
> +    /**
> +     * Describes the type of this integral_constant.
> +     */
> +    typedef integral_constant<_TypeT,_Value> type;
> +
> +    /**
> +     * Describes the type of the value defined by this 
> integral_constant.
> +     */
> +    typedef _TypeT value_type;
> +
> +    /**
> +     * The actual integral constant value.
> +     */
> +    static const _TypeT value = _Value;
> +};
> +
> +#ifndef _RWSTD_NO_STATIC_CONST_MEMBER_DEFINITION
> +
> +template<class _TypeT, _TypeT _Value>
> +const _TypeT integral_constant<_TypeT, _Value>::value;
> +
> +#endif    // _RWSTD_NO_STATIC_CONST_MEMBER_DEFINITION
> +
> +/**
> + * Convenience typedef that is intended to be used as a base class
> + * for boolean type traits that are true.
> + */
> +typedef integral_constant<bool, true>  true_type;
> +
> +/**
> + * Convenience typedef that is intended to be used as a base class
> + * for boolean type traits that are false.
> + */
> +typedef integral_constant<bool, false> false_type;
> +
> +}   // namespace std
> +
> +#endif   // _RWSTD_NO_EXT_CXX_0X
> +
> +#endif   // _RWSTD_TYPE_TRAITS_INCLUDED
> 
> Propchange: stdcxx/branches/4.3.x/include/type_traits
> --------------------------------------------------------------
> ----------------
>     svn:eol-style = native
> 
> Propchange: stdcxx/branches/4.3.x/include/type_traits
> --------------------------------------------------------------
> ----------------
>     svn:keywords = Id
> 
> Added: stdcxx/branches/4.3.x/tests/utilities/20.meta.help.cpp
> URL: 
> http://svn.apache.org/viewvc/stdcxx/branches/4.3.x/tests/utili
> ties/20.meta.help.cpp?rev=664141&view=auto
> ==============================================================
> ================
> --- stdcxx/branches/4.3.x/tests/utilities/20.meta.help.cpp (added)
> +++ stdcxx/branches/4.3.x/tests/utilities/20.meta.help.cpp 
> Fri Jun  6 14:44:17 2008
> @@ -0,0 +1,256 @@
> +// -*- C++ -*-
> +/************************************************************
> ***************
> + *
> + * 20.meta.help.cpp - test exercising tr.meta.help
> + *
> + * $Id$
> + *
> + 
> **************************************************************
> *************
> + *
> + * Licensed to the Apache Software  Foundation (ASF) under 
> one or more
> + * contributor  license agreements.  See  the NOTICE  file 
> distributed
> + * with  this  work  for  additional information  regarding  
> copyright
> + * ownership.   The ASF  licenses this  file to  you under  
> the Apache
> + * License, Version  2.0 (the  "License"); you may  not use  
> this file
> + * except in  compliance with the License.   You may obtain  
> a copy of
> + * the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in 
> writing, software
> + * distributed under the  License is distributed on an  "AS 
> IS" BASIS,
> + * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  
> express or
> + * implied.   See  the License  for  the  specific language  
> governing
> + * permissions and limitations under the License.
> + *
> + * Copyright 1999-2008 Rogue Wave Software, Inc.
> + *
> + 
> **************************************************************
> ************/
> +
> +#include <type_traits>
> +
> +#include <driver.h>
> +
> +// compile out all test code if extensions disabled
> +#ifndef _RWSTD_NO_EXT_CXX_0X
> +
> +/************************************************************
> **************/
> +
> +template <class T, class U>
> +bool test_is_same_type (T, U)
> +{
> +    return 0;
> +}
> +
> +template <class T>
> +bool test_is_same_type (T, T)
> +{
> +    return 1;
> +}
> +
> +template <class T>
> +bool test_is_const (T&)
> +{
> +    return 0;
> +}
> +
> +template <class T>
> +bool test_is_const (const T&)
> +{
> +    return 1;
> +}
> +
> +template <class T, class U>
> +struct test_is_same
> +{
> +    enum { value = 0 };
> +};
> +
> +template <class T>
> +struct test_is_same<T,T>
> +{
> +    enum { value = 1 };
> +};
> +
> +enum enum_t {
> +    E_a, E_b, E_c
> +};
> +
> +/************************************************************
> **************/
> +
> +template <typename Type, Type Value>
> +void test_integral_constant(const char* name, const char* value)
> +{
> +    typedef std::integral_constant<Type, Value>
> +        integral_constant_type;
> +
> +    // verify the type of value is the same as Type
> +    const bool a =
> +        test_is_same_type (integral_constant_type::value, Type ());
> +    rw_assert (a, 0, __LINE__,
> +               "integral_constant<%s, %s>::value is%{?}n't%{;} "
> +               "of type %s", name, value, !a, name);
> +
> +    // verify the value is as expected
> +    const bool b =
> +        integral_constant_type::value == Value;
> +    rw_assert (b, 0, __LINE__,
> +               "integral_constant<%s, %s>::value is%{?}n't%{;} "
> +               "equal to %s", name, value, !b, value);
> +
> +    // verify that the value is const
> +    const bool d =
> +        test_is_const (std::integral_constant<Type,Value>::value);
> +    rw_assert (d, 0, __LINE__,
> +               "integral_constant<%s, %s>::value is%{?}n't%{;} "
> +               "a constant", name, value, !d);
> +
> +    // verify that the type typedef is correct
> +    const bool e =
> +        test_is_same<_TYPENAME integral_constant_type::type,
> +                     integral_constant_type>::value;
> +    rw_assert (e, 0, __LINE__,
> +               "integral_constant<%s, %s>::type is%{?}n't%{;} "
> +               "same as integral_constant<%s, %s>",
> +               name, value, !e, name, value);
> +
> +    // note: compiler should never allow an instantiation of
> +    // integral_constant<T, V> if T is not an integral type.
> +}
> +
> +template <typename Type, bool Value>
> +void test_required_type (const char* name, const char* value)
> +{
> +    typedef Type integral_constant_type;
> +
> +    // verify the type of the type typedef
> +    const bool a =
> +        test_is_same<_TYPENAME 
> integral_constant_type::value_type, bool>::value;
> +    rw_assert (a, 0, __LINE__,
> +               "%s::value_type is%{?}n't%{;} same as bool",
> +               name, !a);
> +
> +    // verify the value is as expected
> +    const bool b =
> +        integral_constant_type::value == Value;
> +    rw_assert (b, 0, __LINE__,
> +               "%s::value is%{?}n't%{;} equal to %s",
> +               name, !b, value);
> +
> +    // verify that Type is same as integral_constant<bool, Value>
> +    const bool c =
> +        test_is_same<std::integral_constant<bool, Value>, 
> Type>::value;
> +    rw_assert (c, 0, __LINE__,
> +               "%s is%{?}n't%{;} of type 
> integral_constant<bool, %s>",
> +               name, !c, value);
> +
> +    test_integral_constant<_TYPENAME 
> integral_constant_type::value_type,
> +                           Value>("bool", value);
> +}
> +
> +/************************************************************
> **************/
> +
> +static int run_test (int, char*[])
> +{
> +#define TEST_INTEGRAL_CONSTANT(Type,Value) \
> +    test_integral_constant<Type, Value>(#Type,#Value)
> +
> +    TEST_INTEGRAL_CONSTANT (bool, true);
> +    TEST_INTEGRAL_CONSTANT (bool, false);
> +
> +    TEST_INTEGRAL_CONSTANT (char, '\0');
> +    TEST_INTEGRAL_CONSTANT (char,  _RWSTD_CHAR_MIN);
> +    TEST_INTEGRAL_CONSTANT (char,  _RWSTD_CHAR_MAX);
> +
> +#ifndef _RWSTD_NO_WCHAR_T
> +    TEST_INTEGRAL_CONSTANT (wchar_t, L'\0');
> +    TEST_INTEGRAL_CONSTANT (wchar_t, _RWSTD_WCHAR_MIN);
> +    TEST_INTEGRAL_CONSTANT (wchar_t, _RWSTD_WCHAR_MAX);
> +#endif   // _RWSTD_NO_WCHAR_T
> +
> +    TEST_INTEGRAL_CONSTANT (signed char, 0);
> +    TEST_INTEGRAL_CONSTANT (signed char, _RWSTD_SCHAR_MIN);
> +    TEST_INTEGRAL_CONSTANT (signed char, _RWSTD_SCHAR_MAX);
> +
> +    TEST_INTEGRAL_CONSTANT (signed short, 0);
> +    TEST_INTEGRAL_CONSTANT (signed short, _RWSTD_SHRT_MIN);
> +    TEST_INTEGRAL_CONSTANT (signed short, _RWSTD_SHRT_MAX);
> +
> +    TEST_INTEGRAL_CONSTANT (signed int, 0);
> +    TEST_INTEGRAL_CONSTANT (signed int, _RWSTD_INT_MIN);
> +    TEST_INTEGRAL_CONSTANT (signed int, _RWSTD_INT_MAX);
> +
> +    TEST_INTEGRAL_CONSTANT (signed long, 0);
> +    TEST_INTEGRAL_CONSTANT (signed long, _RWSTD_LONG_MIN);
> +    TEST_INTEGRAL_CONSTANT (signed long, _RWSTD_LONG_MAX);
> +
> +#ifndef _RWSTD_NO_LONG_LONG
> +    TEST_INTEGRAL_CONSTANT (signed long long, 0);
> +    TEST_INTEGRAL_CONSTANT (signed long long, _RWSTD_LLONG_MIN);
> +    TEST_INTEGRAL_CONSTANT (signed long long, _RWSTD_LLONG_MAX);
> +#endif   // _RWSTD_NO_LONG_LONG
> +
> +    TEST_INTEGRAL_CONSTANT (unsigned char, 1);
> +    TEST_INTEGRAL_CONSTANT (unsigned char, _RWSTD_UCHAR_MIN);
> +    TEST_INTEGRAL_CONSTANT (unsigned char, _RWSTD_UCHAR_MAX);
> +
> +    TEST_INTEGRAL_CONSTANT (unsigned short, 1);
> +    TEST_INTEGRAL_CONSTANT (unsigned short, _RWSTD_USHRT_MIN);
> +    TEST_INTEGRAL_CONSTANT (unsigned short, _RWSTD_USHRT_MAX);
> +
> +    TEST_INTEGRAL_CONSTANT (unsigned int, 1);
> +    TEST_INTEGRAL_CONSTANT (unsigned int, _RWSTD_UINT_MIN);
> +    TEST_INTEGRAL_CONSTANT (unsigned int, _RWSTD_UINT_MAX);
> +
> +    TEST_INTEGRAL_CONSTANT (unsigned long, 1);
> +    TEST_INTEGRAL_CONSTANT (unsigned long, _RWSTD_UINT_MIN);
> +    TEST_INTEGRAL_CONSTANT (unsigned long, _RWSTD_UINT_MAX);
> +
> +#ifndef _RWSTD_NO_LONG_LONG
> +    TEST_INTEGRAL_CONSTANT (unsigned long long, 1);
> +    TEST_INTEGRAL_CONSTANT (unsigned long long, _RWSTD_ULLONG_MIN);
> +    TEST_INTEGRAL_CONSTANT (unsigned long long, _RWSTD_ULLONG_MAX);
> +#endif   // _RWSTD_NO_LONG_LONG
> +
> +    TEST_INTEGRAL_CONSTANT (enum_t,  E_a);
> +    TEST_INTEGRAL_CONSTANT (enum_t,  E_b);
> +    TEST_INTEGRAL_CONSTANT (enum_t,  E_c);
> +
> +#ifdef _ILL_FORMED
> +    TEST_INTEGRAL_CONSTANT (float, 1.f);
> +#endif // _ILL_FORMED
> +
> +#define TEST_REQUIRED_TYPE(Type,Value) \
> +    test_required_type<Type, Value>(#Type, #Value);
> +
> +    TEST_REQUIRED_TYPE (std::true_type , true);
> +    TEST_REQUIRED_TYPE (std::false_type, false);
> +
> +    return 0;
> +}
> +
> +/************************************************************
> **************/
> +
> +#else // _RWSTD_NO_EXT_CXX_0X
> +
> +/************************************************************
> **************/
> +
> +static int run_test (int, char*[])
> +{
> +    rw_warn (0, 0, __LINE__,
> +             "test disabled because _RWSTD_NO_EXT_CXX_0X is 
> defined");
> +    return 0;
> +}
> +
> +#endif // !_RWSTD_NO_EXT_CXX_0X
> +
> +/************************************************************
> **************/
> +
> +int main (int argc, char *argv[])
> +{
> +    return rw_test (argc, argv, __FILE__,
> +                    "tr.meta.help",
> +                    0 /* no comment */,
> +                    run_test,
> +                    0);
> +}
> 
> Propchange: stdcxx/branches/4.3.x/tests/utilities/20.meta.help.cpp
> --------------------------------------------------------------
> ----------------
>     svn:eol-style = native
> 
> Propchange: stdcxx/branches/4.3.x/tests/utilities/20.meta.help.cpp
> --------------------------------------------------------------
> ----------------
>     svn:keywords = Id
> 
> 
> 

Mime
View raw message