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) 13 using namespace std; 14 #endif 15 16 // 17 // TestCase class 18 // 19 class 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 26 protected: 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 46 CPPUNIT_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 55 TEST_INSTANCIATE_CONTAINER(vector); 56 TEST_INSTANCIATE_CONTAINER(list); 57 # if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) 58 TEST_INSTANCIATE_CONTAINER(slist); 59 # endif 60 TEST_INSTANCIATE_CONTAINER(deque); 61 TEST_INSTANCIATE_CONTAINER(set); 62 TEST_INSTANCIATE_CONTAINER(multiset); 63 #endif 64 65 //Function to test pointer to function support: 66 void FTypeInstance() {} 67 68 //Class to test pointer to member method support: 69 class AClass { 70 public: 71 void func() {} 72 }; 73 74 // 75 // tests implementation 76 // 77 void 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 224 typedef void (*Func)(int); 225 void f1(int) {} 226 227 void PtrSpecTest::function_pointer() 228 { 229 vector<Func> fs; 230 fs.push_back(&f1); 231 CPPUNIT_ASSERT( !fs.empty() ); 232 } 233