/***************************************************************************
 *
 * 18.support.dynamic.cpp - test exercising [lib.support.dynamic]
 *
 * $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 2001-2008 Rogue Wave Software.
 *
 **************************************************************************/

#include <new>
#include <memory>
#include <driver.h>

#include <rw/_defs.h>
#include <rw/_error.h>

#include <cstdlib>   // for malloc() and free()
#include <cstring>   // for strlen()


#ifdef _MSC_VER
   // verify that <new> et al can coexist with MSVC's <new.h>
#  include <new.h>
#endif

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

// detects recursive implementation of operator new (size_t, nothrow_t)
static int recursive_new_nothrow = 0;
static int recursive_delete_nothrow = 0;

// MemoryAllocator is used to replace the global new and delete
// in order to test conformance of of the other operators that
// might be defined in <new>

struct MemoryAllocator
{
    MemoryAllocator () {
        init ();
    }

    void* operatorNew (std::size_t n) _THROWS ((std::bad_alloc)) {
        _allocPtr = 0;
        _newCalled = true;
        _bytesRequested = n;
        if (_failAlloc) {
            _failAlloc = false;
            _THROW (std::bad_alloc ());
        }
#if !defined (_RWSTD_NO_EXT_OPERATOR_NEW) && \
     defined (_RWSTD_NO_OPERATOR_NEW_NOTHROW)

        // test our implementation of
        // ::operator new(size_t, const std::nothrow)
        // this operator must not be implemented in terms
        // of ::operator new(size_t) to prevent recursion

        if (recursive_new_nothrow++)
            _allocPtr = std::malloc (_bytesRequested);
        else
            _allocPtr = ::operator new (_bytesRequested, std::nothrow);

        --recursive_new_nothrow;

#else
        _allocPtr = std::malloc (_bytesRequested);
#endif
        return _allocPtr;
    }

    void operatorDelete (void* ptr) _THROWS (()) {
        _deallocPtr = ptr;
#if !defined (_RWSTD_NO_EXT_OPERATOR_NEW) && \
     defined (_RWSTD_NO_OPERATOR_NEW_NOTHROW)
        // memory allocated by our nothrow operator new()
        if (recursive_delete_nothrow++ || recursive_new_nothrow)
            std::free (ptr);
        else
            ::operator delete (ptr, std::nothrow);

        --recursive_delete_nothrow;
#else
        std::free (ptr);
#endif
        _deleteCalled = true;
    }

    void init () {
        _newCalled = _deleteCalled = _failAlloc = false;
        _bytesRequested = 0;
        _deallocPtr = _allocPtr = 0;
    }

    bool newCalled () {
        bool tmp = _newCalled;
        _newCalled = 0;
        return tmp;
    }

    bool deleteCalled () {
        bool tmp = _deleteCalled;
        _deleteCalled = 0;
        return tmp;
    }

    std::size_t  _bytesRequested;
    bool              _newCalled;
    bool              _deleteCalled;
    bool              _failAlloc;
    void*             _allocPtr;
    void*             _deallocPtr;
};


// static instance of memory allocator
static MemoryAllocator alloc;

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


// replace the global operators with MemoryAllocator versions
void* operator new (std::size_t size) _THROWS ((std::bad_alloc))
{
    return alloc.operatorNew (size);
}

void operator delete (void* p) _THROWS (())
{
    alloc.operatorDelete (p);
}

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


#define TEST_OP_THROWS(expr,cond,tag)                \
    _TRY {                                           \
        alloc._failAlloc = true;                     \
        expr;                                        \
        rw_assert (cond, 0, __LINE__, tag);          \
    }                                                \
    _CATCH (std::bad_alloc) {                        \
        RW_ASSERT (!cond, 0, __LINE__, tag);         \
    }                                                \
    _CATCH (...) {                                   \
        rw_assert (!cond, 0, __LINE__, tag);         \
    }                                                \
    (void)0

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


// provide a handler for unexpected exceptions so that at least the
//  test will log the event rather than just aborting
void my_unexpected_handler ()
{
    rw_assert (false, 0, __LINE__, "caught an unexpected exception\n");
}

// used in exists_set_new_handler below
void my_new_handler ()
{
}

//  grab default throw procedure
void (*default_throw_proc)(int, char*) = _RW::__rw_throw_proc;

bool my_throw_proc_called = false;

// my_throw_proc just sets a global flag to indicate
// that it was called, and then dispatches the call
// to the default throw procedure
static void my_throw_proc (int id, char* what)
{
    my_throw_proc_called = true;
    default_throw_proc (id, what);
}

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


static
int run_test (int, char* [])
{
    std::set_unexpected (&my_unexpected_handler);

    if (1) {
        // exists_std_nothrow
        const std::nothrow_t* p = &std::nothrow;
        rw_assert (p != 0, 0, __LINE__, "std::nothrow defined");
    }

    if (1) {
        // exists_bad_alloc
        std::bad_alloc ba1;         // default ctor
        std::bad_alloc ba2 = ba1;   // copy ctor

        std::exception* e = &ba1;   // derived from exception
        (void) &e;
        ba1 = ba2;                  // assignment operator

        // verify that a member function is accessible and has the
        // appropriate signature, including return type and exception
        // specification

        std::bad_alloc& (std::bad_alloc::*p_op_assign)
                (const std::bad_alloc&) _PTR_THROWS (())
            = &std::bad_alloc::operator=;
        _RWSTD_UNUSED (p_op_assign);

        const char*
        (std::bad_alloc::*p_what_fn)() const _PTR_THROWS (())
             = &std::bad_alloc::what;
        _RWSTD_UNUSED (p_what_fn);

        const char* s = ba1.what ();
        rw_assert (s && 0 != std::strlen (s), 0, __LINE__,
                   "std::bad_alloc::what() returned bad string");
    }

    if (1) {
        // set_new_handler
        typedef void (*new_handler_t) ();

        new_handler_t (*f) (new_handler_t) _PTR_THROWS (());
        f = &std::set_new_handler;

        rw_assert (f != 0, 0, __LINE__,
                   "std::set_new_handler() defined");

        new_handler_t original_handler
            = std::set_new_handler (my_new_handler);

#if !defined (__EDG__) || __EDG_VERSION__ > 245 || defined (__DECCXX)

        // EDG eccp 2.45 standalone demo is known to fail
        rw_assert (original_handler == 0, 0, __LINE__,
                   "std::set_new_handler() unexpectedly returned "
                   "installed handler");

#define _RWSTD_NO_EXT_OPERATOR_NEW

#endif   // !__EDG__ || __EDG_VERSION__ > 245 || __DECCXX

        new_handler_t replacement_handler
            = std::set_new_handler (original_handler);
        rw_assert (my_new_handler == replacement_handler, 0, __LINE__,
                   "std::set_new_handler() failed to return previously "
                   "installed handler");
    }

    // test all operators that we have provided definitions for
    // in <new>; exercises the operators by setting the
    // replacement allocator to fail, and asserting that an
    // exception is thrown or not as appropriate for the operator
    if (1) {
        // operator new throws
        void* ptr = 0;
        _RWSTD_UNUSED (ptr);

        alloc.init ();      // reset the allocator

#ifdef _RWSTD_NO_OPERATOR_NEW_NOTHROW

        // verify that the nothrow version of operator new provided
        // by our library doesn't call the ordinary operator new
        // (if it did it would cause recursion if a replacement operator
        // new were to be implemented in terms of the nothrow version)

        // also verify that it returns 0 on failure

        // force a failure by requesting too large a block of storage
        // size_t (~0) alone isn't good enough since it causes annoying
        // dialog boxes to be popped up by the MSVCRTD, the MSVC runtime
        TEST_OP_THROWS ((ptr = operator new (~0U - 4096U, std::nothrow)),
                        (ptr == 0),
                        "operator new(size_t, nothrow_t) returns 0");

        rw_assert (!alloc.newCalled (), 0, __LINE__,
                   "operator new called by operator new(size_t, nothrow)");

#endif // defined _RWSTD_NO_OPERATOR_NEW_NOTHROW

#if defined (_RWSTD_NO_OPERATOR_DELETE_NOTHROW) && \
   !defined (_RWSTD_NO_PLACEMENT_DELETE)

        // verify that the nothrow version of operator delete provided
        // by our library prevents exceptions from propagating
        TEST_OP_THROWS ((operator delete (0, std::nothrow)), true,
                        "operator delete(void*, nothrow_t) doesn't throw");

        // verify that the nothrow version of operator delete provided
        // by our library doesn't call the ordinary operator delete
        // (if it did it might cause recursion if a replacement operator
        // delete were to be implemented in terms of the nothrow version)
        rw_assert (!alloc.deleteCalled (), 0, __LINE__,
                   "operator delete(void*) called by "
                   "operator delete(void*, nothrow_t)");

#endif   // _RWSTD_NO_OPERATOR_DELETE_NOTHROW && _RWSTD_NO_PLACEMENT_DELETE

#ifdef _RWSTD_NO_OPERATOR_NEW_ARRAY

        // verify that the array form of operator new throws bad_alloc on
        // failure
        TEST_OP_THROWS ((operator new[] (1)), false,
                        "operator new[] (size_t) throws bad_alloc");

        // verify that the array form of operator new provided by our
        // library calls the ordinary operator new
        rw_assert (alloc.newCalled (), 0, __LINE__,
                   "operator new called by operator new[](size_t)");

#endif // defined _RWSTD_NO_OPERATOR_NEW_ARRAY

#ifdef _RWSTD_NO_OPERATOR_NEW_ARRAY_NOTHROW

        TEST_OP_THROWS ((ptr = operator new[](1, std::nothrow)),
                        (ptr == 0),
                        "operator new[] (size_t, nothrow_t) returns 0");

        rw_assert (alloc.newCalled (), 0, __LINE__,
                   "operator new(size_t) called by "
                   "operator new[](size_t, nothrow_t)");

#endif // defined _RWSTD_NO_OPERATOR_NEW_ARRAY_NOTHROW

#ifdef _RWSTD_NO_OPERATOR_DELETE_ARRAY

        TEST_OP_THROWS ((operator delete[] (0)), true,
                        "operator delete[] (void*) doesn't throw");

        rw_assert (alloc.deleteCalled (), 0, __LINE__,
                   "operator delete called by operator delete[](void*)");

#endif // defined _RWSTD_NO_OPERATOR_DELETE_ARRAY

#if defined (_RWSTD_NO_OPERATOR_DELETE_ARRAY_NOTHROW) && \
   !defined ( _RWSTD_NO_PLACEMENT_DELETE)

        TEST_OP_THROWS ((operator delete[] (0, std::nothrow)), true,
                        "operator delete[] (void*, nothrow_t) doesn't "
                        "throw");

        rw_assert (alloc.deleteCalled (), 0, __LINE__,
                   "operator delete(void*) called by "
                   "operator delete[](void*, nothrow_t)");

#endif // _RWSTD_NO_OPERATOR_DELETE_ARRAY_NOTHROW &&
        // !_RWSTD_NO_PLACEMENT_DELETE

        // verify that the nothrow form of operator new provided by our
        // library isn't recursively implemented in terms of the ordinary
        // operator new
        rw_assert (0 == recursive_new_nothrow, 0, __LINE__,
                   "operator new (size_t, nothrow_t) causes recursion");

        rw_assert (0 == recursive_delete_nothrow, 0, __LINE__,
                   "operator delete (void*, nothrow_t) causes recursion");
    }

    // __rw_allocate() is like ::operator new() except that it calls
    // __rw_throw() on failure (which may throw std::bad_alloc).
    //  This test checks that __rw_throw() is called,
    //  that it properly calls __rw_throw_proc(), and that bad_alloc
    //  is thrown. We'll use the replaced ::operator new() to
    //  control when a memory allocation request will fail.

#ifndef _RWSTD_NO_REPLACEABLE_NEW_DELETE

    const bool test_rw_allocate = true;

#else   // if defined (_RWSTD_NO_REPLACEABLE_NEW_DELETE)

    // avoid tests that depend on the replacement operators new
    // and delete on platforms like AIX or Win32 where they cannot
    // be reliably replaced
    const bool test_rw_allocate = false;

#endif   // _RWSTD_NO_REPLACEABLE_NEW_DELETE

    if (test_rw_allocate) {

        alloc.init ();      // reset the allocator

        _RW::__rw_throw_proc = my_throw_proc; // set the throw func
        my_throw_proc_called = false;

        for (std::size_t i = 0; i < 10; ++i) {

            char* ptr = 0;

            const bool doFail = !!(i % 2);    // prevent MSVC warning 4800
            if (doFail)
                alloc._failAlloc = true;

            try {
                // allocation
                alloc._bytesRequested = ~i;   // reset

                ptr = _RWSTD_STATIC_CAST (char*, _RW::__rw_allocate (i));
                rw_assert (alloc._bytesRequested == i, 0, __LINE__,
                           "__rw_allocate (%u) requested %u bytes",
                           i, alloc._bytesRequested);

                rw_assert (alloc.newCalled (), 0, __LINE__,
                           "operator new() called");
                rw_assert (!doFail,  0, __LINE__,
                           "allocation succeeded");
                rw_assert (my_throw_proc_called == false,
                           0, __LINE__,
                           "my_throw_proc called");

                // deallocation
                _RW::__rw_deallocate (ptr, i);

                rw_assert (alloc.deleteCalled (),
                           0, __LINE__,
                           "operator delete() called");
                rw_assert (alloc._deallocPtr == ptr,
                           0, __LINE__,
                           "allocated memory deallocated");

            }
            catch (std::bad_alloc) {
                rw_assert (doFail, 0, __LINE__,
                           "expected bad_alloc exception");

                rw_assert (my_throw_proc_called == true, 0, __LINE__,
                           "my_throw_proc called");
            }
            catch (...) {
                rw_assert (false, 0, __LINE__,
                           "expected std::bad_alloc exception");
            }

            my_throw_proc_called = false;
        }
    }
    else {
        rw_warn (false, 0, __LINE__,
                 "__rw::__rw_allocate() not exercised: "
                 "_RWSTD_NO_REPLACEABLE_NEW_DELETE #defined");
    }

    return 0;
}

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


int main (int argc, char* argv [])
{
    return rw_test (argc, argv, __FILE__,
                    "lib.support.dynamic",
                    0 /* no comment */,
                    run_test,
                    "",
                    (void*)0);
}
