[cfe-commits] r73147 - /cfe/trunk/test/SemaTemplate/example-typelist.cpp

Douglas Gregor dgregor at apple.com
Tue Jun 9 14:22:32 PDT 2009


Author: dgregor
Date: Tue Jun  9 16:22:32 2009
New Revision: 73147

URL: http://llvm.org/viewvc/llvm-project?rev=73147&view=rev
Log:
Example metaprogram for reversing and searching in a type list

Modified:
    cfe/trunk/test/SemaTemplate/example-typelist.cpp

Modified: cfe/trunk/test/SemaTemplate/example-typelist.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/example-typelist.cpp?rev=73147&r1=73146&r2=73147&view=diff

==============================================================================
--- cfe/trunk/test/SemaTemplate/example-typelist.cpp (original)
+++ cfe/trunk/test/SemaTemplate/example-typelist.cpp Tue Jun  9 16:22:32 2009
@@ -1,5 +1,6 @@
 // RUN: clang-cc -fsyntax-only -verify %s
 
+// A simple cons-style typelist
 struct nil { };
 
 template<typename Head, typename Tail = nil>
@@ -8,6 +9,17 @@
   typedef Tail tail;
 };
 
+// is_same trait, for testing
+template<typename T, typename U>
+struct is_same {
+  static const bool value = false;
+};
+
+template<typename T>
+struct is_same<T, T> {
+  static const bool value = true;
+};
+
 // metaprogram that computes the length of a list
 template<typename T> struct length;
 
@@ -26,3 +38,61 @@
                   cons<unsigned int,
                        cons<unsigned long> > > > unsigned_inttypes;
 int length0[length<unsigned_inttypes>::value == 4? 1 : -1];
+
+// metaprogram that reverses a list
+
+// FIXME: I would prefer that this be a partial specialization, but
+// that requires partial ordering of class template partial
+// specializations.
+template<typename T> 
+class reverse {
+  typedef typename reverse<typename T::tail>::type reversed_tail;
+
+  typedef typename reverse<typename reversed_tail::tail>::type most_of_tail;
+
+public:
+  typedef cons<typename reversed_tail::head,
+               typename reverse<cons<typename T::head, most_of_tail> >::type> type;
+};
+
+template<typename Head>
+class reverse<cons<Head> > {
+public:
+  typedef cons<Head> type;
+};
+
+template<>
+class reverse<nil> {
+public:
+  typedef nil type;
+};
+
+int reverse0[is_same<reverse<unsigned_inttypes>::type,
+                     cons<unsigned long, 
+                          cons<unsigned int, 
+                               cons<unsigned short,
+                                    cons<unsigned char> > > > >::value? 1 : -1];
+
+// metaprogram that finds a type within a list
+
+// FIXME: I would prefer that this be a partial specialization, but
+// that requires partial ordering of class template partial
+// specializations.
+template<typename List, typename T>
+struct find : find<typename List::tail, T> { };
+
+template<typename Tail, typename T>
+struct find<cons<T, Tail>, T> {
+  typedef cons<T, Tail> type;
+};
+
+template<typename T>
+struct find<nil, T> {
+  typedef nil type;
+};
+
+int find0[is_same<find<unsigned_inttypes, unsigned int>::type,
+                       cons<unsigned int, cons<unsigned long> > >::value?
+             1 : -1];
+int find1[is_same<find<unsigned_inttypes, int>::type, nil>::value? 1 : -1];
+





More information about the cfe-commits mailing list