1#include <vector> 2#include <list> 3#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) 4# include <slist> 5#endif 6#include <deque> 7#include <set> 8#include <iterator> 9 10#include "cppunit/cppunit_proxy.h" 11 12#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES) 13using namespace std; 14#endif 15 16// 17// TestCase class 18// 19class PtrSpecTest : public CPPUNIT_NS::TestCase 20{ 21 CPPUNIT_TEST_SUITE(PtrSpecTest); 22 CPPUNIT_TEST(ptr_specialization_test); 23 CPPUNIT_TEST(function_pointer); 24 CPPUNIT_TEST_SUITE_END(); 25 26protected: 27 /// this seems to be compile only test but... 28 void ptr_specialization_test(); 29 void function_pointer(); 30 31 template <class _Tp> 32 struct unary_pred { 33 bool operator () (_Tp *__ptr) const { 34 return *__ptr == 0; 35 } 36 }; 37 38 template <class _Tp> 39 struct binary_pred { 40 bool operator () (_Tp *__first, _Tp *__second) const { 41 return *__first < *__second; 42 } 43 }; 44}; 45 46CPPUNIT_TEST_SUITE_REGISTRATION(PtrSpecTest); 47 48#define TEST_INSTANCIATE_CONTAINER(cont) \ 49 template class cont<int*>; \ 50 template class cont<int const*>; \ 51 template class cont<int volatile*>; \ 52 template class cont<int const volatile*> 53 54#if !defined(_MSC_VER) || (_MSC_VER > 1200) // excluding MSVC 6.0 55TEST_INSTANCIATE_CONTAINER(vector); 56TEST_INSTANCIATE_CONTAINER(list); 57# if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) 58TEST_INSTANCIATE_CONTAINER(slist); 59# endif 60TEST_INSTANCIATE_CONTAINER(deque); 61TEST_INSTANCIATE_CONTAINER(set); 62TEST_INSTANCIATE_CONTAINER(multiset); 63#endif 64 65//Function to test pointer to function support: 66void FTypeInstance() {} 67 68//Class to test pointer to member method support: 69class AClass { 70public: 71 void func() {} 72}; 73 74// 75// tests implementation 76// 77void PtrSpecTest::ptr_specialization_test() 78{ 79 int *int_array[] = {0, 0, 0}; 80 int const* cint_array[] = {0, 0, 0}; 81 82 { 83 vector<void*> void_vect; 84 deque<void*> void_deque; 85 list<void*> void_list; 86#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) 87 slist<void*> void_slist; 88#endif 89 } 90 91 { 92 typedef void (*FType)(); 93 vector<FType> func_vector; 94 func_vector.push_back(&FTypeInstance); 95 } 96 97#if !defined(__GNUC__) || (__GNUC__ > 2) 98 { 99 typedef void (AClass::*MFType)(); 100 vector<MFType> mem_func_vector; 101 mem_func_vector.push_back(&AClass::func); 102 } 103#endif 104 105 vector<int*> pint_vect; 106 vector<int*> pint_vect2; 107 vector<int const*> pcint_vect; 108 list<int*> pint_list; 109 list<int*> pint_list2; 110 list<int const*> pcint_list; 111#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) 112 slist<int*> pint_slist; 113 slist<int*> pint_slist2; 114 slist<int const*> pcint_slist; 115#endif 116 deque<int*> pint_deque; 117 deque<int*> pint_deque2; 118 deque<int const*> pcint_deque; 119 120#if !defined (STLPORT) || defined (_STLP_MEMBER_TEMPLATES) 121 vector<int*> pint_vect_from_list(pint_list.begin(), pint_list.end()); 122#endif 123 pint_vect.insert(pint_vect.end(), pint_vect2.begin(), pint_vect2.end()); 124 pint_vect.insert(pint_vect.end(), int_array, int_array + 3); 125 pint_vect2.insert(pint_vect2.end(), int_array, int_array + 3); 126 pcint_vect.insert(pcint_vect.end(), int_array, int_array + 3); 127 pcint_vect.insert(pcint_vect.end(), cint_array, cint_array + 3); 128#if !defined (STLPORT) || !defined(_STLP_DEBUG) || defined(_STLP_MEMBER_TEMPLATES) 129 pcint_vect.insert(pcint_vect.end(), pint_vect2.begin(), pint_vect2.end()); 130#endif 131 pcint_vect.insert(pcint_vect.end(), int_array, int_array + 3); 132#if !defined (STLPORT) || defined (_STLP_MEMBER_TEMPLATES) 133 pint_vect.insert(pint_vect.end(), pint_list.begin(), pint_list.end()); 134 pcint_vect.insert(pcint_vect.end(), pint_list.begin(), pint_list.end()); 135 pcint_vect.insert(pcint_vect.end(), pcint_list.begin(), pcint_list.end()); 136 pint_vect.assign(pint_list.begin(), pint_list.end()); 137 pcint_vect.assign(pint_list.begin(), pint_list.end()); 138#endif 139 pint_vect.assign(int_array, int_array + 3); 140 pcint_vect.assign(int_array, int_array + 3); 141 pcint_vect.assign(cint_array, cint_array + 3); 142 copy(int_array, int_array + 3, back_inserter(pint_vect)); 143 144#if !defined (STLPORT) || defined (_STLP_MEMBER_TEMPLATES) 145 pint_list.sort(binary_pred<int>()); 146 pcint_list.sort(binary_pred<int const>()); 147 pint_list.unique(binary_pred<int>()); 148 pcint_list.unique(binary_pred<int const>()); 149 pint_list.merge(pint_list, binary_pred<int>()); 150 pcint_list.merge(pcint_list, binary_pred<int const>()); 151 pint_list.remove_if(unary_pred<int>()); 152 pcint_list.remove_if(unary_pred<int const>()); 153#endif 154 155 copy(int_array, int_array + 3, back_inserter(pint_list)); 156 copy(int_array, int_array + 3, back_inserter(pint_list2)); 157 pint_list.insert(pint_list.end(), pint_list2.begin(), pint_list2.end()); 158#if !defined (STLPORT) || defined (_STLP_MEMBER_TEMPLATES) 159 pcint_list.insert(pcint_list.end(), pint_list.begin(), pint_list.end()); 160#endif 161#if !defined (STLPORT) || !defined(_STLP_DEBUG) || defined(_STLP_MEMBER_TEMPLATES) 162 pint_list.insert(pint_list.end(), pint_vect.begin(), pint_vect.end()); 163 pcint_list.insert(pcint_list.end(), pint_vect.begin(), pint_vect.end()); 164 pcint_list.insert(pcint_list.end(), pcint_vect.begin(), pcint_vect.end()); 165 list<int*> pint_list_from_vect(pint_vect.begin(), pint_vect.end()); 166 pint_list.assign(pint_vect.begin(), pint_vect.end()); 167 pcint_list.assign(pint_vect.begin(), pint_vect.end()); 168#endif 169 pint_list.insert(pint_list.begin(), int_array, int_array + 3); 170 pint_list.insert(pint_list.end(), int_array, int_array + 3); 171 pcint_list.insert(pcint_list.end(), int_array, int_array + 3); 172 pcint_list.insert(pcint_list.end(), cint_array, cint_array + 3); 173 pint_list.assign(int_array, int_array + 3); 174 pcint_list.assign(int_array, int_array + 3); 175 pcint_list.assign(cint_array, cint_array + 3); 176 //pint_list.assign(pcint_vect.begin(), pcint_vect.end()); 177 178#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) 179 copy(int_array, int_array + 3, front_inserter(pint_slist)); 180 copy(int_array, int_array + 3, front_inserter(pint_slist2)); 181 pint_slist.insert(pint_slist.end(), pint_slist2.begin(), pint_slist2.end()); 182# if defined (_STLP_MEMBER_TEMPLATES) 183 pcint_slist.insert(pcint_slist.end(), pint_slist.begin(), pint_slist.end()); 184# endif 185# if !defined (_STLP_DEBUG) || defined (_STLP_MEMBER_TEMPLATES) 186 pint_slist.insert(pint_slist.end(), pint_vect.begin(), pint_vect.end()); 187 pcint_slist.insert(pcint_slist.end(), pint_vect.begin(), pint_vect.end()); 188 pcint_slist.insert(pcint_slist.end(), pcint_vect.begin(), pcint_vect.end()); 189 slist<int*> pint_slist_from_vect(pint_vect.begin(), pint_vect.end()); 190 pint_slist.assign(pint_vect.begin(), pint_vect.end()); 191 pcint_slist.assign(pint_vect.begin(), pint_vect.end()); 192# endif 193 pint_slist.insert(pint_slist.end(), int_array, int_array + 3); 194 pcint_slist.insert(pcint_slist.end(), int_array, int_array + 3); 195 pcint_slist.insert(pcint_slist.end(), cint_array, cint_array + 3); 196 pint_slist.assign(int_array, int_array + 3); 197 pcint_slist.assign(int_array, int_array + 3); 198 pcint_slist.assign(cint_array, cint_array + 3); 199 //pint_slist.assign(pcint_vect.begin(), pcint_vect.end()); 200#endif 201 202 copy(int_array, int_array + 3, back_inserter(pint_deque)); 203 copy(int_array, int_array + 3, back_inserter(pint_deque2)); 204 pint_deque.insert(pint_deque.end(), pint_deque2.begin(), pint_deque2.end()); 205#if !defined (STLPORT) || defined (_STLP_MEMBER_TEMPLATES) 206 pcint_deque.insert(pcint_deque.end(), pint_deque.begin(), pint_deque.end()); 207#endif 208#if !defined (STLPORT) || !defined(_STLP_DEBUG) || defined(_STLP_MEMBER_TEMPLATES) 209 pint_deque.insert(pint_deque.end(), pint_vect.begin(), pint_vect.end()); 210 pcint_deque.insert(pcint_deque.end(), pint_vect.begin(), pint_vect.end()); 211 pcint_deque.insert(pcint_deque.end(), pcint_vect.begin(), pcint_vect.end()); 212 deque<int*> pint_deque_from_vect(pint_vect.begin(), pint_vect.end()); 213 pint_deque.assign(pint_vect.begin(), pint_vect.end()); 214 pcint_deque.assign(pint_vect.begin(), pint_vect.end()); 215#endif 216 pint_deque.insert(pint_deque.end(), int_array, int_array + 3); 217 pcint_deque.insert(pcint_deque.end(), int_array, int_array + 3); 218 pcint_deque.insert(pcint_deque.end(), cint_array, cint_array + 3); 219 pint_deque.assign(int_array, int_array + 3); 220 pcint_deque.assign(int_array, int_array + 3); 221 pcint_deque.assign(cint_array, cint_array + 3); 222} 223 224typedef void (*Func)(int); 225void f1(int) {} 226 227void PtrSpecTest::function_pointer() 228{ 229 vector<Func> fs; 230 fs.push_back(&f1); 231 CPPUNIT_ASSERT( !fs.empty() ); 232} 233