2006-10-17 Thierry GERAUD <theo(a)tegucigalpa.lrde.epita.fr>
Add basic function to remove '*', '&', "const", and
"[]" from
types.
* mlc/basic.hh: New.
* mlc/is_a.hh (mlc_is_a, mlc_is_a_): Use basic_ for T.
(mlc_is_not_a, mlc_is_not_a_): Likewise.
Index: mlc/basic.hh
===================================================================
--- mlc/basic.hh (revision 0)
+++ mlc/basic.hh (revision 653)
@@ -0,0 +1,78 @@
+// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 EPITA Research and Development
Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+#ifndef MLC_BASIC_HH
+# define MLC_BASIC_HH
+
+
+/** \def mlc_basic(Type)
+ ** \brief Remove '*', '&', "const", and "[]"
from \a Type.
+ **
+ */
+# define mlc_basic(Type) typename mlc::basic_< Type >::ret
+/// Likewise, without the leading \c typename keyword.
+# define mlc_basic_(Type) mlc::basic_< Type >::ret
+
+
+
+namespace mlc
+{
+
+ template <typename T>
+ struct basic_
+ {
+ typedef T ret;
+ };
+
+ template <typename T>
+ struct basic_ < T*
+ {
+ typedef typename basic_<T>::ret ret;
+ };
+
+ template <typename T>
+ struct basic_< T&
+ {
+ typedef typename basic_<T>::ret ret;
+ };
+
+ template <typename T>
+ struct basic_< const T
+ {
+ typedef typename basic_<T>::ret ret;
+ };
+
+ template <typename T>
+ struct basic_< T[]
+ {
+ typedef typename basic_<T>::ret ret;
+ };
+
+} // end of namespace mlc
+
+
+#endif // ! MLC_BASIC_HH
Index: mlc/is_a.hh
===================================================================
--- mlc/is_a.hh (revision 652)
+++ mlc/is_a.hh (revision 653)
@@ -31,6 +31,7 @@
# include <mlc/bool.hh>
# include <mlc/bexpr.hh>
# include <mlc/wrap.hh>
+# include <mlc/basic.hh>
// private macro so do _not_ use it
@@ -202,7 +203,6 @@
{};
};
-
} // end of namespace mlc
@@ -238,13 +238,13 @@
** template < template < class, class > class > class
*/
-# define mlc_is_a(T, U) \
-mlc::wrap_< \
- typename mlc::is_a_< sizeof(mlc::form::of< U >()) >::template ret< T, U
> \
+# define mlc_is_a(T, U) \
+mlc::wrap_< \
+ typename mlc::is_a_< sizeof(mlc::form::of< U >()) >::template ret<
typename mlc::basic_<T>::ret, U > \
# define mlc_is_a_(T, U) \
-mlc::is_a_< sizeof(mlc::form::of< U >()) >::ret< T, U
+mlc::is_a_< sizeof(mlc::form::of< U
>()) >::ret< mlc::basic_<T>::ret, U
/*! \def mlc_is_not_a(T, U)
@@ -255,13 +255,13 @@
** \see mlc_is_a(T, U)
*/
-# define mlc_is_not_a(T, U) \
-mlc::not_< \
- typename mlc::is_a_<sizeof(mlc::form::of<U >())>::template ret< T, U
> \
+# define mlc_is_not_a(T, U) \
+mlc::not_< \
+ typename mlc::is_a_<sizeof(mlc::form::of<U >())>::template ret< typename
mlc::basic_<T>::ret, U > \
# define mlc_is_not_a_(T, U) \
-mlc::not_< mlc::is_a_< sizeof(mlc::form::of<U >())>::ret< T, U >
+mlc::not_< mlc::is_a_<
sizeof(mlc::form::of<U >())>::ret< mlc::basic_<T>::ret, U >
#endif // ! MLC_IS_A_HH