| #include <vector> |
| #include <list> |
| #if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) |
| # include <slist> |
| #endif |
| #include <deque> |
| #include <set> |
| #include <iterator> |
| |
| #include "cppunit/cppunit_proxy.h" |
| |
| #if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES) |
| using namespace std; |
| #endif |
| |
| // |
| // TestCase class |
| // |
| class PtrSpecTest : public CPPUNIT_NS::TestCase |
| { |
| CPPUNIT_TEST_SUITE(PtrSpecTest); |
| CPPUNIT_TEST(ptr_specialization_test); |
| CPPUNIT_TEST(function_pointer); |
| CPPUNIT_TEST_SUITE_END(); |
| |
| protected: |
| /// this seems to be compile only test but... |
| void ptr_specialization_test(); |
| void function_pointer(); |
| |
| template <class _Tp> |
| struct unary_pred { |
| bool operator () (_Tp *__ptr) const { |
| return *__ptr == 0; |
| } |
| }; |
| |
| template <class _Tp> |
| struct binary_pred { |
| bool operator () (_Tp *__first, _Tp *__second) const { |
| return *__first < *__second; |
| } |
| }; |
| }; |
| |
| CPPUNIT_TEST_SUITE_REGISTRATION(PtrSpecTest); |
| |
| #define TEST_INSTANCIATE_CONTAINER(cont) \ |
| template class cont<int*>; \ |
| template class cont<int const*>; \ |
| template class cont<int volatile*>; \ |
| template class cont<int const volatile*> |
| |
| #if !defined(_MSC_VER) || (_MSC_VER > 1200) // excluding MSVC 6.0 |
| TEST_INSTANCIATE_CONTAINER(vector); |
| TEST_INSTANCIATE_CONTAINER(list); |
| # if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) |
| TEST_INSTANCIATE_CONTAINER(slist); |
| # endif |
| TEST_INSTANCIATE_CONTAINER(deque); |
| TEST_INSTANCIATE_CONTAINER(set); |
| TEST_INSTANCIATE_CONTAINER(multiset); |
| #endif |
| |
| //Function to test pointer to function support: |
| void FTypeInstance() {} |
| |
| //Class to test pointer to member method support: |
| class AClass { |
| public: |
| void func() {} |
| }; |
| |
| // |
| // tests implementation |
| // |
| void PtrSpecTest::ptr_specialization_test() |
| { |
| int *int_array[] = {0, 0, 0}; |
| int const* cint_array[] = {0, 0, 0}; |
| |
| { |
| vector<void*> void_vect; |
| deque<void*> void_deque; |
| list<void*> void_list; |
| #if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) |
| slist<void*> void_slist; |
| #endif |
| } |
| |
| { |
| typedef void (*FType)(); |
| vector<FType> func_vector; |
| func_vector.push_back(&FTypeInstance); |
| } |
| |
| #if !defined(__GNUC__) || (__GNUC__ > 2) |
| { |
| typedef void (AClass::*MFType)(); |
| vector<MFType> mem_func_vector; |
| mem_func_vector.push_back(&AClass::func); |
| } |
| #endif |
| |
| vector<int*> pint_vect; |
| vector<int*> pint_vect2; |
| vector<int const*> pcint_vect; |
| list<int*> pint_list; |
| list<int*> pint_list2; |
| list<int const*> pcint_list; |
| #if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) |
| slist<int*> pint_slist; |
| slist<int*> pint_slist2; |
| slist<int const*> pcint_slist; |
| #endif |
| deque<int*> pint_deque; |
| deque<int*> pint_deque2; |
| deque<int const*> pcint_deque; |
| |
| #if !defined (STLPORT) || defined (_STLP_MEMBER_TEMPLATES) |
| vector<int*> pint_vect_from_list(pint_list.begin(), pint_list.end()); |
| #endif |
| pint_vect.insert(pint_vect.end(), pint_vect2.begin(), pint_vect2.end()); |
| pint_vect.insert(pint_vect.end(), int_array, int_array + 3); |
| pint_vect2.insert(pint_vect2.end(), int_array, int_array + 3); |
| pcint_vect.insert(pcint_vect.end(), int_array, int_array + 3); |
| pcint_vect.insert(pcint_vect.end(), cint_array, cint_array + 3); |
| #if !defined (STLPORT) || !defined(_STLP_DEBUG) || defined(_STLP_MEMBER_TEMPLATES) |
| pcint_vect.insert(pcint_vect.end(), pint_vect2.begin(), pint_vect2.end()); |
| #endif |
| pcint_vect.insert(pcint_vect.end(), int_array, int_array + 3); |
| #if !defined (STLPORT) || defined (_STLP_MEMBER_TEMPLATES) |
| pint_vect.insert(pint_vect.end(), pint_list.begin(), pint_list.end()); |
| pcint_vect.insert(pcint_vect.end(), pint_list.begin(), pint_list.end()); |
| pcint_vect.insert(pcint_vect.end(), pcint_list.begin(), pcint_list.end()); |
| pint_vect.assign(pint_list.begin(), pint_list.end()); |
| pcint_vect.assign(pint_list.begin(), pint_list.end()); |
| #endif |
| pint_vect.assign(int_array, int_array + 3); |
| pcint_vect.assign(int_array, int_array + 3); |
| pcint_vect.assign(cint_array, cint_array + 3); |
| copy(int_array, int_array + 3, back_inserter(pint_vect)); |
| |
| #if !defined (STLPORT) || defined (_STLP_MEMBER_TEMPLATES) |
| pint_list.sort(binary_pred<int>()); |
| pcint_list.sort(binary_pred<int const>()); |
| pint_list.unique(binary_pred<int>()); |
| pcint_list.unique(binary_pred<int const>()); |
| pint_list.merge(pint_list, binary_pred<int>()); |
| pcint_list.merge(pcint_list, binary_pred<int const>()); |
| pint_list.remove_if(unary_pred<int>()); |
| pcint_list.remove_if(unary_pred<int const>()); |
| #endif |
| |
| copy(int_array, int_array + 3, back_inserter(pint_list)); |
| copy(int_array, int_array + 3, back_inserter(pint_list2)); |
| pint_list.insert(pint_list.end(), pint_list2.begin(), pint_list2.end()); |
| #if !defined (STLPORT) || defined (_STLP_MEMBER_TEMPLATES) |
| pcint_list.insert(pcint_list.end(), pint_list.begin(), pint_list.end()); |
| #endif |
| #if !defined (STLPORT) || !defined(_STLP_DEBUG) || defined(_STLP_MEMBER_TEMPLATES) |
| pint_list.insert(pint_list.end(), pint_vect.begin(), pint_vect.end()); |
| pcint_list.insert(pcint_list.end(), pint_vect.begin(), pint_vect.end()); |
| pcint_list.insert(pcint_list.end(), pcint_vect.begin(), pcint_vect.end()); |
| list<int*> pint_list_from_vect(pint_vect.begin(), pint_vect.end()); |
| pint_list.assign(pint_vect.begin(), pint_vect.end()); |
| pcint_list.assign(pint_vect.begin(), pint_vect.end()); |
| #endif |
| pint_list.insert(pint_list.begin(), int_array, int_array + 3); |
| pint_list.insert(pint_list.end(), int_array, int_array + 3); |
| pcint_list.insert(pcint_list.end(), int_array, int_array + 3); |
| pcint_list.insert(pcint_list.end(), cint_array, cint_array + 3); |
| pint_list.assign(int_array, int_array + 3); |
| pcint_list.assign(int_array, int_array + 3); |
| pcint_list.assign(cint_array, cint_array + 3); |
| //pint_list.assign(pcint_vect.begin(), pcint_vect.end()); |
| |
| #if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) |
| copy(int_array, int_array + 3, front_inserter(pint_slist)); |
| copy(int_array, int_array + 3, front_inserter(pint_slist2)); |
| pint_slist.insert(pint_slist.end(), pint_slist2.begin(), pint_slist2.end()); |
| # if defined (_STLP_MEMBER_TEMPLATES) |
| pcint_slist.insert(pcint_slist.end(), pint_slist.begin(), pint_slist.end()); |
| # endif |
| # if !defined (_STLP_DEBUG) || defined (_STLP_MEMBER_TEMPLATES) |
| pint_slist.insert(pint_slist.end(), pint_vect.begin(), pint_vect.end()); |
| pcint_slist.insert(pcint_slist.end(), pint_vect.begin(), pint_vect.end()); |
| pcint_slist.insert(pcint_slist.end(), pcint_vect.begin(), pcint_vect.end()); |
| slist<int*> pint_slist_from_vect(pint_vect.begin(), pint_vect.end()); |
| pint_slist.assign(pint_vect.begin(), pint_vect.end()); |
| pcint_slist.assign(pint_vect.begin(), pint_vect.end()); |
| # endif |
| pint_slist.insert(pint_slist.end(), int_array, int_array + 3); |
| pcint_slist.insert(pcint_slist.end(), int_array, int_array + 3); |
| pcint_slist.insert(pcint_slist.end(), cint_array, cint_array + 3); |
| pint_slist.assign(int_array, int_array + 3); |
| pcint_slist.assign(int_array, int_array + 3); |
| pcint_slist.assign(cint_array, cint_array + 3); |
| //pint_slist.assign(pcint_vect.begin(), pcint_vect.end()); |
| #endif |
| |
| copy(int_array, int_array + 3, back_inserter(pint_deque)); |
| copy(int_array, int_array + 3, back_inserter(pint_deque2)); |
| pint_deque.insert(pint_deque.end(), pint_deque2.begin(), pint_deque2.end()); |
| #if !defined (STLPORT) || defined (_STLP_MEMBER_TEMPLATES) |
| pcint_deque.insert(pcint_deque.end(), pint_deque.begin(), pint_deque.end()); |
| #endif |
| #if !defined (STLPORT) || !defined(_STLP_DEBUG) || defined(_STLP_MEMBER_TEMPLATES) |
| pint_deque.insert(pint_deque.end(), pint_vect.begin(), pint_vect.end()); |
| pcint_deque.insert(pcint_deque.end(), pint_vect.begin(), pint_vect.end()); |
| pcint_deque.insert(pcint_deque.end(), pcint_vect.begin(), pcint_vect.end()); |
| deque<int*> pint_deque_from_vect(pint_vect.begin(), pint_vect.end()); |
| pint_deque.assign(pint_vect.begin(), pint_vect.end()); |
| pcint_deque.assign(pint_vect.begin(), pint_vect.end()); |
| #endif |
| pint_deque.insert(pint_deque.end(), int_array, int_array + 3); |
| pcint_deque.insert(pcint_deque.end(), int_array, int_array + 3); |
| pcint_deque.insert(pcint_deque.end(), cint_array, cint_array + 3); |
| pint_deque.assign(int_array, int_array + 3); |
| pcint_deque.assign(int_array, int_array + 3); |
| pcint_deque.assign(cint_array, cint_array + 3); |
| } |
| |
| typedef void (*Func)(int); |
| void f1(int) {} |
| |
| void PtrSpecTest::function_pointer() |
| { |
| vector<Func> fs; |
| fs.push_back(&f1); |
| CPPUNIT_ASSERT( !fs.empty() ); |
| } |