/**************************************************************************
 *
 * examples.h - common definitions to condition example code for broken
 *              compilers; must be #included last, _after_ all lib headers.
 *
 * The goal of this file is to allow completely conforming syntax
 * in examples' code even with non-conforming compilers.
 *
 * $Id: examples.h 550991 2007-06-26 23:58:07Z sebor $
 *
 ***************************************************************************
 *
 * 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.
 * 
 **************************************************************************/

#ifndef EXAMPLES_H_INCLUDED
#define EXAMPLES_H_INCLUDED


#ifdef _RWSTD_NO_NAMESPACE
# define std
#endif   // _RWSTD_NO_NAMESPACE


#ifdef _RWSTD_NO_TYPENAME
# define typename
#endif   // _RWSTD_NO_TYPENAME


#ifdef _RWSTD_NO_FOR_LOCAL_SCOPE
#  define for if (0) ; else for
#endif   // _RWSTD_NO_FOR_LOCAL_SCOPE

#include <cstddef>  // for ptrdiff_t

#ifdef _RWSTD_NO_LIBC_IN_STD

_RWSTD_NAMESPACE (std) { 

// accomdate compilers that don't have size_t in namespace std
_USING (::size_t);
_USING (::ptrdiff_t);

}   // namespace std

#endif   // _RWSTD_NO_LIBC_IN_STD


#ifdef _RWSTD_NO_CLASS_PARTIAL_SPEC

// supply conforming versions of count, count_if and distance for platforms
// that do not correctly support partial specialization of class templates

_RWSTD_NAMESPACE (std) {     
    
template<class InputIter, class T>
size_t count (InputIter a, InputIter b, const T& x)
{
    size_t n = 0;
    count (a, b, x, n);
    return n;
}

template<class InputIter, class T>
size_t count_if (InputIter a, InputIter b, const T& x)
{
    size_t n = 0;
    count_if (a, b, x, n);
    return n;

}

template<class InputIter>
size_t distance (InputIter a, InputIter b)
{
    size_t n = 0;
    distance (a, b, n);
    return n;
} 

}   // namespace std

#endif   // _RWSTD_NO_CLASS_PARTIAL_SPEC




#ifdef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE

#if !defined (_MSC_VER) || _MSC_VER > 1300

_RWSTD_NAMESPACE (std) { 

#define has_facet fake_has_facet
#define use_facet fake_use_facet

// fake std::use_facet
template <class Facet>
struct has_facet
{
    has_facet (const std::locale &loc)

#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE

        : result (std::has_facet<Facet>(loc)) { }

#else

        : result (std::has_facet (loc, (Facet*)0)) { }

#endif   // _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE

    operator bool () const {
        return result;
    }

    bool result;
};


// fake std::use_facet
template <class Facet>
struct use_facet
{
    use_facet (const std::locale &loc)
        : facet (std::_USE_FACET (Facet, loc)) { }

    operator const Facet& () const {
        return facet;
    }

    const Facet &facet;
};

}   // namespace std

#else   // if defined (_MSC_VER) && _MSC_VER <= 1300
#  define _HAS_FACET(facet, locale)   has_facet (locale, (facet*)0)
#endif   // !defined (_MSC_VER) || _MSC_VER > 1300

#endif   // _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE


#ifdef _RWSTD_NO_EXCEPTIONS
#  define try            if (1)
#  define catch(ex)      else if (0) for (ex ; 0 ; )
#  define throw(ignore)  abort ()
#endif   // _RWSTD_NO_EXCEPTIONS


#ifdef _RWSTD_NO_WCHAR_T

// remove `L' from wide string literals
#define L

// fake wide stream objects
#define wcin          cin
#define wcout         cout
#define wcerr         cerr
#define wclog         clog

// fake wide string and stringstream
#define wstring       string
#define wstringstream stringstream

#define wchar_t       char

#endif   // _RWSTD_NO_WCHAR_T


// undefine macros #defined by some evil C libraries (e.g., MSVC)
#undef max
#undef min


#endif   // EXAMPLES_H_INCLUDED
