/***************************************************************************
 *
 * 25.reverse.cpp - test exercising 25.2.9 [lib.alg.reverse]
 *
 * $Id$
 *
 ***************************************************************************
 *
 * Licensed to the Apache Software  Foundation (ASF) under one or more
 * contributor  license agreements.  See  the NOTICE  file distributed
 * with  this  work  for  additional information  regarding  copyright
 * ownership.   The ASF  licenses this  file to  you under  the Apache
 * License, Version  2.0 (the  "License"); you may  not use  this file
 * except in  compliance with the License.   You may obtain  a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the  License is distributed on an  "AS IS" BASIS,
 * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
 * implied.   See  the License  for  the  specific language  governing
 * permissions and limitations under the License.
 *
 * Copyright 1994-2006 Rogue Wave Software.
 * 
 **************************************************************************/

#include <algorithm>    // for reverse, reverse_copy
#include <cstring>      // for size_t, strlen()

#include <rw_alg_test.h>
#include <rw_value.h>   // for UserClass
#include <rw_driver.h>  // for rw_test()

/**************************************************************************/

_RWSTD_NAMESPACE (std) { 

// disable explicit instantiation for compilers (like MSVC)
// that can't handle it
#ifndef _RWSTD_NO_EXPLICIT_INSTANTIATION

template
void reverse (BidirIter<assign<base<cpy_ctor> > >, 
              BidirIter<assign<base<cpy_ctor> > >);

template
OutputIter<eq_comp<assign<base<> > > >
reverse_copy (BidirIter<eq_comp<assign<base<> > > >, 
              BidirIter<eq_comp<assign<base<> > > >,
              OutputIter<eq_comp<assign<base<> > > >);

#endif // _RWSTD_NO_EXPLICIT_INSTANTIATION

}   // namespace std

/**************************************************************************/

// tags to select reverse or reverse_copy at compile time
struct ReverseTag {
    enum { fname_inx = 0 };
    int dummy;
};

struct ReverseCopyTag {
    enum { fname_inx = 1 };
    int dummy;
};

// used as a dummy template argument to test functions exercising reverse()
// and reverse_if() (to differentiate from reverse_copy() and reverse_copy_if())
struct NoIterator { };
const char* type_name (NoIterator, const UserClass*)
{
    return 0;
}

/**************************************************************************/

unsigned iter_swap_calls;

_RWSTD_NAMESPACE (std) {

_RWSTD_SPECIALIZED_FUNCTION
void iter_swap (BidirIter<UserClass> i, BidirIter<UserClass> j)
{
    ++iter_swap_calls;

    const int tmp = (*i).data_.val_;

    (*i).data_.val_ = (*j).data_.val_;
    (*j).data_.val_ = tmp;
}

_RWSTD_SPECIALIZED_FUNCTION
void iter_swap (RandomAccessIter<UserClass> i, RandomAccessIter<UserClass> j)
{
    ++iter_swap_calls;

    const int tmp = (*i).data_.val_;

    (*i).data_.val_ = (*j).data_.val_;
    (*j).data_.val_ = tmp;
}

}   // namespace std


/**************************************************************************/

// exercises std::reverse()
template <class Iterator, class T>
void test_reverse (int line,
                   const char *src,
                   Iterator dummy, NoIterator, const T*, ReverseTag)
{
    static const char* const itname = type_name (dummy, (T*)0);
    const char* const fname = "reverse";

    // compute the length of the source sequence
    const std::size_t nsrc = std::strlen (src);

    // construct a sequence of `nsrc' elements to pass to reverse
    T* const xsrc = T::from_char (src, nsrc);

    // construct iterators pointing to the beginning and end
    // of the source sequence
    const Iterator first = make_iter (xsrc, xsrc, xsrc + nsrc, dummy);
    const Iterator last  = make_iter (xsrc + nsrc, xsrc, xsrc + nsrc, dummy);

    // zero out the iter_swap() call counter
    iter_swap_calls = 0;

    // call reverse()
    std::reverse (first, last);

    bool success = true;
    std::size_t i = 0;

    // verify that the sequence was correctly reversed and that it was
    // done by swapping elements i.e., not simply by copying them over
    for ( ; i != nsrc; ++i) {

        typedef unsigned char UChar;

        success = UChar (src [i]) == xsrc [nsrc - i - 1].data_.val_;
        if (!success)
            break;
    }

    rw_assert (success, 0, line,
               "line %d: %s<%s>(\"%s\", ...) ==> "
               "\"%{X=*.*}\"; unexpected element value %#c at offset %zu",
               __LINE__, fname, itname, src,
               int (sizeof (*xsrc)), int (nsrc), int (i), xsrc,
               xsrc [nsrc - i - 1].data_.val_, i);

    const std::size_t iter_swap_expect = nsrc / 2;
    success = iter_swap_calls == iter_swap_expect;
    rw_assert (success, 0, line,
               "line %d: %s<%s>(\"%s\", ...); called iter_swap() "
               "%zu times, %zu expected",
               __LINE__, fname, itname, src,
               iter_swap_calls, iter_swap_expect);

    delete[] xsrc;
}

/**************************************************************************/

// exercises std::reverse_copy()
template <class Iterator, class OutputIterator, class T>
void test_reverse (int line,
                   const char *src,
                   Iterator& it, OutputIterator& ,
                   const T*, ReverseCopyTag)
{
    static const char* const itname = type_name (it, (T*)0);
    const char* const fname = "reverse_copy";

    const std::size_t nsrc = std::strlen (src);

    T* const xsrc = T::from_char (src, nsrc);
    T* const xdst = T::from_char (src, nsrc);

    const Iterator first (xsrc, xsrc, xsrc + nsrc);
    const Iterator last  (xsrc + nsrc, xsrc, xsrc + nsrc);

    const OutputIterator result (xdst, xdst, xdst + nsrc);

    std::size_t last_n_op_assign = T::n_total_op_assign_;

    const OutputIterator end = std::reverse_copy (first, last, result);

    // verify that the returned iterator is set as expected
    bool success = end.cur_ == result.cur_ + nsrc;
    rw_assert (success, 0, line,
               "line %d: %s<%s>(\"%s\", ...) == result + %zu, got %td",
               __LINE__, fname, itname, src, nsrc, end.cur_ - xdst);

    // verify that the sequence was correctly reversed
    std::size_t i = 0;
    for ( ; i != nsrc; ++i) {

        typedef unsigned char UChar;

        success = UChar (src [i]) == xdst [nsrc - i - 1].data_.val_;
        if (!success)
            break;
    }

    rw_assert (success, 0, line,
               "line %d: %s<%s>(\"%s\", ...) ==> "
               "\"%{X=*.*}\"; unexpected element value %#c at offset %zu",
               __LINE__, fname, itname, src,
               int (sizeof (*xsrc)), int (nsrc), int (i), xsrc,
               xdst [nsrc - i - 1].data_.val_, i);

    success = T::n_total_op_assign_ - last_n_op_assign == nsrc;
    rw_assert (success, 0, line,
               "line %d: %s<%s>(\"%s\", ...); called operator=() "
               "%zu times, %zu expected",
               __LINE__, fname, itname, src,
               T::n_total_op_assign_ - last_n_op_assign, nsrc);

    delete[] xsrc;
    delete[] xdst;
}

/**************************************************************************/

// exercises all four function templates
template <class Iterator1, class Iterator2, class T, class Tag>
void test_reverse (Iterator1 it1, Iterator2 it2, const T*, Tag tag)
{
    static const char* const it1name = type_name (it1, (T*)0);
    static const char* const it2name = type_name (it2, (T*)0);

    if (tag.fname_inx) {  // reverse_copy()
        rw_info (0, 0, 0, "std::reverse_copy (%s, %1$s, %s)", it1name, it2name);
    }
    else {   // reverse()
        rw_info (0, 0, 0,  "std::reverse (%s, %1$s)", it1name);
    }


#define TEST(src) \
    test_reverse (__LINE__, src, it1, it2, (T*)0, tag)

    TEST ("");
    TEST ("a");
    TEST ("ab");
    TEST ("abc");
    TEST ("abcd");
    TEST ("abcde");
    TEST ("abcdef");
    TEST ("abcdefg");
    TEST ("abcdefgh");
    TEST ("abcdefghi");
    TEST ("abcdefghij");
    TEST ("abcdefghijk");
    TEST ("abcdefghijkl");
    TEST ("abcdefghijklm");
    TEST ("abcdefghijklmn");
    TEST ("abcdefghijklmno");
    TEST ("abcdefghijklmnop");
    TEST ("abcdefghijklmnopq");
    TEST ("abcdefghijklmnopqr");
    TEST ("abcdefghijklmnopqrs");
    TEST ("abcdefghijklmnopqrst");
    TEST ("abcdefghijklmnopqrstu");
    TEST ("abcdefghijklmnopqrstuv");
    TEST ("abcdefghijklmnopqrstuvw");
    TEST ("abcdefghijklmnopqrstuvwx");
    TEST ("abcdefghijklmnopqrstuvwxy");
    TEST ("abcdefghijklmnopqrstuvwxyz");
}

/**************************************************************************/

/* extern */ int rw_opt_no_reverse;            // --no-reverse
/* extern */ int rw_opt_no_reverse_copy;       // --no-reverse_copy
/* extern */ int rw_opt_no_output_iter;        // --no-OutputIterator
/* 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


template <class T, class Tag>
void test_reverse(const T*, Tag tag)
{
    rw_info (0, 0, 0,
             "template <class %s> %1$s std::reverse (%1$s, %1$s)",
             "BidirectionalIterator");

    if (rw_opt_no_bidir_iter) {
        rw_note (0, __FILE__, __LINE__, "BidirectionalIterator test disabled");
    }
    else {
        test_reverse (BidirIter<T>(), NoIterator (), (T*)0, tag);
    }

    if (rw_opt_no_rnd_iter) {
        rw_note (0, __FILE__, __LINE__,  "RandomAccessIterator test disabled");
    }
    else {
        test_reverse (RandomAccessIter<T>(), NoIterator (), (T*)0, tag);
    }
}

/**************************************************************************/

template <class ReverseIterator, class T, class Tag>
void test_reverse_copy (ReverseIterator it, const T*, Tag tag)
{
    if (rw_opt_no_output_iter) {
        rw_note (0, __FILE__, __LINE__, "OutputIterator test disabled");
    }
    else {
        test_reverse (it, OutputIter<T>(0, 0, 0), (T*)0, tag);
    }

    if (rw_opt_no_fwd_iter) {
        rw_note (0, __FILE__, __LINE__, "ForwardIterator test disabled");
    }
    else {
        test_reverse (it, FwdIter<T>(), (T*)0, tag);
    }

    if (rw_opt_no_bidir_iter) {
        rw_note (0, __FILE__, __LINE__, "BidirectionalIterator test disabled");
    }
    else {
        test_reverse (it, BidirIter<T>(), (T*)0, tag);
    }

    if (rw_opt_no_rnd_iter) {
        rw_note (0, __FILE__, __LINE__, "RandomAccessIterator test disabled");
    }
    else {
        test_reverse (it, RandomAccessIter<T>(), (T*)0, tag);
    }
}

/**************************************************************************/

template <class T, class Tag>
void test_reverse_copy (const T*, Tag tag)
{
    rw_info (0, 0, 0,
             "template <class %s, class %s> %2$s "
             "std::reverse_copy (%1$s, %1$s, %2$s)",
             "BidirectionalIterator", "OutputIterator");

    if (rw_opt_no_bidir_iter) {
        rw_note (0, __FILE__, __LINE__, "BidirectionalIterator test disabled");
    }
    else {
        test_reverse_copy (ConstBidirIter<T>(), (T*)0, tag);
    }

    if (rw_opt_no_rnd_iter) {
        rw_note (0, __FILE__, __LINE__, "RandomAccessIterator test disabled");
    }
    else {
        test_reverse_copy (ConstRandomAccessIter<T>(), (T*)0, tag);
    }
}

/**************************************************************************/

static int
run_test (int, char*[])
{
    const ReverseTag reverse_tag = { false };
    const ReverseCopyTag reverse_copy_tag = { true };

    if (rw_opt_no_reverse) {
        rw_note (0, __FILE__, __LINE__, "std::reverse test disabled");
    }
    else {
        test_reverse((UserClass*)0, reverse_tag);
    }

    if (rw_opt_no_reverse_copy) {
        rw_note (0, __FILE__, __LINE__, "std::reverse_copy test disabled");
    }
    else {
        test_reverse_copy((UserClass*)0, reverse_copy_tag);
    }

    return 0;
}

/**************************************************************************/

int main (int argc, char *argv[])
{
    return rw_test (argc, argv, __FILE__,
                    "lib.alg.reverse",
                    0 /* no comment */, run_test,
                    "|-no-reverse# "
                    "|-no-reverse_copy# "
                    "|-no-OutputIterator# "
                    "|-no-ForwardIterator# "
                    "|-no-BidirectionalIterator# "
                    "|-no-RandomAccessIterator#",                    
                    &rw_opt_no_reverse,
                    &rw_opt_no_reverse_copy,
                    &rw_opt_no_output_iter,
                    &rw_opt_no_fwd_iter,
                    &rw_opt_no_bidir_iter,
                    &rw_opt_no_rnd_iter);
}
