You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stdcxx.apache.org by se...@apache.org on 2005/12/03 22:30:19 UTC

svn commit: r352022 - /incubator/stdcxx/trunk/tests/algorithms/25.find.end.cpp

Author: sebor
Date: Sat Dec  3 13:30:15 2005
New Revision: 352022

URL: http://svn.apache.org/viewcvs?rev=352022&view=rev
Log:
2005-12-03  Anton Pevtsov  <an...@moscow.vdiweb.com>

	STDCXX-4
	* 25.find.end.cpp: New test exercising lib.alg.fin.end.

Added:
    incubator/stdcxx/trunk/tests/algorithms/25.find.end.cpp   (with props)

Added: incubator/stdcxx/trunk/tests/algorithms/25.find.end.cpp
URL: http://svn.apache.org/viewcvs/incubator/stdcxx/trunk/tests/algorithms/25.find.end.cpp?rev=352022&view=auto
==============================================================================
--- incubator/stdcxx/trunk/tests/algorithms/25.find.end.cpp (added)
+++ incubator/stdcxx/trunk/tests/algorithms/25.find.end.cpp Sat Dec  3 13:30:15 2005
@@ -0,0 +1,338 @@
+/***************************************************************************
+ *
+ * find_end.cpp - test exercising 25.1.3 [lib.alg.find.end]
+ *
+ * $Id$
+ *
+ ***************************************************************************
+ *
+ * Copyright (c) 1994-2005 Quovadx, Inc. All Rights Reserved.
+ * 
+ * This computer software  is owned by Quovadx, Inc.  and is protected by
+ * U.S.  copyright laws  and other  laws and  by  international treaties.
+ * This computer  software is furnished  by Quovadx, Inc., pursuant  to a
+ * written license  agreement and may  be used, copied,  transmitted, and
+ * stored only in accordance with the terms of such license agreement and
+ * with  the inclusion  of  the above  copyright  notice.  This  computer
+ * software or any other copies  thereof may not be provided or otherwise
+ * made available to any other person.
+ * 
+ * 
+ * U.S. Government Restricted Rights.
+ * 
+ * This computer software: (a) was developed at private expense and is in
+ * all respects the proprietary information of Quovadx, Inc.; (b) was not
+ * developed with  government funds;  (c) is a  trade secret  of Quovadx,
+ * Inc. for all purposes of the  Freedom of Information Act; and (d) is a
+ * commercial item  and thus, pursuant  to Section 12.212 of  the Federal
+ * Acquisition  Regulations (FAR) and  DFAR Supplement  Section 227.7202,
+ * Government's use,  duplication or disclosure of  the computer software
+ * is subject to the restrictions set forth by Quovadx, Inc.
+ * 
+ **************************************************************************/
+
+#include <algorithm>    // for find_end
+#include <functional>   // for equal_to
+#include <cstddef>      // for size_t
+
+#include <alg_test.h>   
+#include <driver.h>     // for rw_test
+
+/**************************************************************************/
+
+_RWSTD_NAMESPACE (std) { 
+
+#ifndef _RWSTD_NO_EXPLICIT_INSTANTIATION
+
+template
+FwdIter<eq_comp<base<> > > 
+find_end (FwdIter<eq_comp<base<> > >, FwdIter<eq_comp<base<> > >, 
+          FwdIter<eq_comp<base<> > >, FwdIter<eq_comp<base<> > >);
+
+template
+FwdIter<eq_comp<base<> > > 
+find_end (FwdIter<eq_comp<base<> > >, FwdIter<eq_comp<base<> > >, 
+          FwdIter<eq_comp<base<> > >, FwdIter<eq_comp<base<> > >, 
+          binary_predicate<eq_comp<base<> > >);
+
+#endif // _RWSTD_NO_EXPLICIT_INSTANTIATION
+
+}   // namespace std
+
+/**************************************************************************/
+
+// used to initialize an array of objects of type T
+static const char *tinit_begin;
+
+int tinit ()
+{
+    typedef unsigned char UChar;
+
+    return UChar (*tinit_begin++);
+}
+
+
+// exercises std::find_end()
+template <class ForwardIterator1, class ForwardIterator2, class T>
+void do_test (int               line,     // line number of test case
+              const char       *src,      // source sequence
+              const char       *fseq,     // sequence to be found
+              std::size_t       resoff,   // offset of result
+              ForwardIterator1 &dummy_iter1,
+              ForwardIterator2 &dummy_iter2,
+              const T*,
+              const char       *predicate)
+{
+    static const char* const it1name = type_name (dummy_iter1, (T*)0);
+    static const char* const it2name = type_name (dummy_iter2, (T*)0);
+
+    const std::size_t nsrc  = std::strlen (src);
+    const std::size_t nfseq = std::strlen (fseq);
+
+    if (std::size_t (-1) == resoff)
+        resoff = nsrc;
+
+    // have the T default ctor initialize objects from `src'
+    tinit_begin = src;
+    T::gen_     = tinit;
+
+    T* const tsrc = new T [nsrc];
+
+    T* const src_begin = tsrc;
+    T* const src_end   = tsrc + nsrc;
+
+    // have the T default ctor initialize sequence to be found
+    tinit_begin = fseq;
+
+    T* const tfseq = new T [nfseq];
+
+    T* const fseq_begin = tfseq;
+    T* const fseq_end   = tfseq + nfseq;
+
+    // create iterators
+    const ForwardIterator1 first1 =
+        make_iter (src_begin, src_begin, src_end, dummy_iter1);
+
+    const ForwardIterator1 last1 =
+        make_iter (src_end, src_begin, src_end, dummy_iter1);
+
+    const ForwardIterator2 first2 =
+        make_iter (fseq_begin, fseq_begin, fseq_end, dummy_iter2);
+
+    const ForwardIterator2 last2 =
+        make_iter (fseq_end, fseq_begin, fseq_end, dummy_iter2);
+
+    // compute the number of invocations of the predicate
+    std::size_t last_n_op_assign = T::n_total_op_assign_;
+
+    const ForwardIterator1 res = predicate ? 
+          std::find_end (first1, last1, first2, last2, std::equal_to<T>())
+        : std::find_end (first1, last1, first2, last2);
+    
+    // silence a bogus EDG eccp remark #550-D:
+    // variable "res" was set but never used
+    _RWSTD_UNUSED (res);
+
+    bool success = res.cur_ == first1.cur_ + resoff;
+    rw_assert (success, 0, line, 
+               "line %d: find_end<%s, %s>(it = \"%s\", \"%s\")"
+               " == (it + %zu), got (it + %td)",
+               __LINE__, it1name, it2name, src, fseq,
+               resoff, res.cur_ - first1.cur_);
+
+    if (!success)
+        return;
+
+    if (res.cur_ != last1.cur_) {
+        std::size_t j = 0;
+        for ( ; j < nfseq; ++j) {
+            success = (res.cur_ + j)->val_ == fseq[j];
+            if (!success)
+                break;
+        }
+
+        rw_assert (success, 0, line, 
+                   "line %d: find_end<%s, %s>(it = \"%s\", \"%s\")"
+                   " expected value %c got %c at %zu position",
+                   __LINE__, it1name, it2name, src, fseq,
+                   fseq[j], (res.cur_ + j)->val_, j);
+
+        if (!success)
+            return;
+    }
+
+    success =
+        T::n_total_op_assign_ - last_n_op_assign <= nfseq * (nsrc - nfseq + 1);
+    rw_assert (success, 0, line, 
+               "line %d: find_end<%s, %s>(it = \"%s\", \"%s\")"
+               " %s invoked %zu times, expected no more than %td",
+               __LINE__, it1name, it2name, src, fseq,
+               predicate ? predicate : "comparison operator", 
+               T::n_total_op_eq_, nfseq * (nsrc - nfseq + 1));
+}
+
+/**************************************************************************/
+
+template <class ForwardIterator1, class ForwardIterator2, class T>
+void run_tests (const ForwardIterator1& dummy_iter1, 
+                const ForwardIterator2& dummy_iter2,
+                const T*, const char* predicate)
+{
+    static const char* const it1name = type_name (dummy_iter1, (T*)0);
+    static const char* const it2name = type_name (dummy_iter2, (T*)0);
+
+    rw_info (0, 0, 0, "%s std::find_end (%1$s, %1$s, %s, %2$s%{?}, %s%{;})", 
+             it1name, it2name, 0 != predicate, predicate);
+    
+#define TEST(src, fnd, off_res) \
+    do_test (__LINE__, src, fnd, std::size_t (off_res), \
+             dummy_iter1, dummy_iter2, (X*)0, predicate)
+
+    //    +------------------ subject sequence
+    //    |                +--- sequence to be found
+    //    |                |   
+    //    |                |      +-- offset of returned iterator,
+    //    |                |      |   -1 denotes the end of sequence
+    //    v                v      v
+    TEST ("abcdefghijk",   "ab",  0);
+    TEST ("abcdefghijk",   "bc",  1);
+    TEST ("abcdefghijk",   "cd",  2);
+    TEST ("abcdefghijk",   "de",  3);
+    TEST ("abcdefghijk",   "ef",  4);
+    TEST ("abcdefghijk",   "fg",  5);
+    TEST ("abcdefghijk",   "gh",  6);
+    TEST ("abcdefghijk",   "hi",  7);
+    TEST ("abcdefghijk",   "ij",  8);
+    TEST ("abcdefghijk",   "jk",  9);
+
+    TEST ("ababcdefghij",  "ab",  2);
+    TEST ("abcbcdefghij",  "bc",  3);
+    TEST ("abcdcdefghij",  "cd",  4);
+    TEST ("abcdedefghij",  "dE",  5);
+    TEST ("abcdefefghij",  "ef",  6);
+    TEST ("abcdefgfghij",  "fg",  7);
+    TEST ("abcdefghghij",  "gh",  8);
+    TEST ("abcdefghihij",  "hi",  9);
+    TEST ("bcdefghijijk",  "ij",  9);
+    TEST ("bcdefghijkjk",  "jk", 10);
+
+    TEST ("",               "a", -1);
+    TEST ("a",             "ab", -1);
+    TEST ("ab",           "abc", -1);
+    TEST ("abc",         "abcd", -1);
+    TEST ("abcd",       "abcde", -1);
+    TEST ("abcde",     "abcdef", -1);
+    TEST ("abcdef",   "abcdefg", -1);
+    TEST ("abcdefg", "abcdefgh", -1);
+
+    TEST ("abcdefghijk",   "ba", -1);
+    TEST ("abcdefghijk",   "cb", -1);
+    TEST ("abcdefghijk",   "dc", -1);
+    TEST ("abcdefghijk",   "ed", -1);
+    TEST ("abcdefghijk",   "fe", -1);
+    TEST ("abcdefghijk",   "gf", -1);
+    TEST ("abcdefghijk",   "hg", -1);
+    TEST ("abcdefghijk",   "ih", -1);
+    TEST ("abcdefghijk",   "ji", -1);
+}
+
+/**************************************************************************/
+
+/* extern */ int rw_opt_no_fwd_iter;     // --no-ForwardIterator
+/* extern */ int rw_opt_no_bidir_iter;   // --no-BidirectionalIterator
+/* extern */ int rw_opt_no_rnd_iter;     // --no-RandomAccessIterator
+/* extern */ int rw_opt_no_predicate;    // --no-Predicate
+
+
+template <class ForwardIterator, class T>
+void run_test_find_end (const ForwardIterator& dummy, T*, 
+                        const char* predicate)
+{
+    if (rw_opt_no_fwd_iter) {
+        rw_note (0, __FILE__, __LINE__, "ForwardIterator test disabled");
+    }
+    else {
+        run_tests (dummy, FwdIter<T>(), (T*)0, predicate);
+    }
+
+    if (rw_opt_no_bidir_iter) {
+        rw_note (0, __FILE__, __LINE__, "BidirectionalIterator test disabled");
+    }
+    else {
+        run_tests (dummy, BidirIter<T>(), (T*)0, predicate);
+    }
+
+    if (rw_opt_no_rnd_iter) {
+        rw_note (0, __FILE__, __LINE__, "RandomAccessIterator test disabled");
+    }
+    else {
+        run_tests (dummy, RandomAccessIter<T>(), (T*)0, predicate);
+    }
+}
+
+/**************************************************************************/
+
+static void
+test_find_end (const char* predicate)
+{
+    rw_info (0, 0, 0, 
+             "template <class %s, class %s> "
+             "%1$s std::find_end (%1$s, %1$s, %2$s, %2$s%{?}, %s%{;})",
+             "ForwardIterator1", "ForwardIterator2", 
+             0 != predicate, predicate);
+
+    if (rw_opt_no_fwd_iter) {
+        rw_note (0, __FILE__, __LINE__, "ForwardIterator test disabled");
+    }
+    else {       
+        run_test_find_end (FwdIter<X>(), (X*)0, predicate);
+    }
+
+    if (rw_opt_no_bidir_iter) {
+        rw_note (0, __FILE__, __LINE__, "BidirectionalIterator test disabled");
+    }
+    else {
+        run_test_find_end (BidirIter<X>(), (X*)0, predicate);
+    }
+
+    if (rw_opt_no_rnd_iter) {
+        rw_note (0, __FILE__, __LINE__, "RandomAccessIterator test disabled");
+    }
+    else {
+        run_test_find_end (RandomAccessIter<X>(), (X*)0, predicate);
+    }
+}
+
+/**************************************************************************/
+
+static int
+run_test (int, char*[])
+{
+    test_find_end (0);
+
+    if (rw_opt_no_predicate) {
+        rw_note (0, __FILE__, __LINE__, "Predicate test disabled");
+    }
+    else {
+        test_find_end ("std::equal_to<X>");
+    }
+                
+    return 0;
+}
+
+/**************************************************************************/
+
+int main (int argc, char *argv[])
+{
+    return rw_test (argc, argv, __FILE__,
+                    "lib.alg.find.end",
+                    0 /* no comment */, run_test,                    
+                    "|-no-ForwardIterator#"
+                    "|-no-BidirectionalIterator#"
+                    "|-no-RandomAccessIterator#"
+                    "|-no-Predicate#",
+                    &rw_opt_no_fwd_iter,
+                    &rw_opt_no_bidir_iter,
+                    &rw_opt_no_rnd_iter,
+                    &rw_opt_no_predicate);
+}

Propchange: incubator/stdcxx/trunk/tests/algorithms/25.find.end.cpp
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/stdcxx/trunk/tests/algorithms/25.find.end.cpp
------------------------------------------------------------------------------
    svn:keywords = Id