#ifndef BOOST_SERIALIZATION_TEST_A_HPP
#define BOOST_SERIALIZATION_TEST_A_HPP

// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once
#endif

/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// A.hpp    simple class test

// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
// Use, modification and distribution is subject to the Boost Software
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)

//  See http://www.boost.org for updates, documentation, and revision history.

#include <ostream> // for friend output operators
#include <cstddef> // size_t
#include <string>
#include <boost/config.hpp>
#if defined(BOOST_NO_STDC_NAMESPACE)
namespace std{
    using ::size_t;
}
#endif

#include <boost/detail/workaround.hpp>
#include <boost/limits.hpp>
#include <boost/cstdint.hpp>

#include <boost/serialization/access.hpp>

#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
    #include <boost/detail/workaround.hpp>
    #if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)
    #include <boost/archive/dinkumware.hpp>
    #endif
#endif

#include <boost/serialization/nvp.hpp>
#include <boost/serialization/string.hpp>

#include <boost/preprocessor/facilities/empty.hpp>

#include "test_decl.hpp"

#if defined(A_IMPORT)
    #define DLL_DECL IMPORT_DECL
#elif defined(A_EXPORT)
    #define DLL_DECL EXPORT_DECL
#else
    #define DLL_DECL(x)
#endif

class DLL_DECL(BOOST_PP_EMPTY()) A
{
private:
    friend class boost::serialization::access;
    // note: from an aesthetic perspective, I would much prefer to have this
    // defined out of line.  Unfortunately, this trips a bug in the VC 6.0
    // compiler. So hold our nose and put it her to permit running of tests.
    // mscvc 6.0 requires template functions to be implemented. For this
    // reason we can't make abstract.
    #if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
        template<class Archive>
        void serialize(
            Archive &ar,
            const unsigned int /* file_version */
        ){
            ar & BOOST_SERIALIZATION_NVP(b);
            #ifndef BOOST_NO_INT64_T
            ar & BOOST_SERIALIZATION_NVP(f);
            ar & BOOST_SERIALIZATION_NVP(g);
            #endif
            #if BOOST_WORKAROUND(__BORLANDC__,  <= 0x551 )
                int i;
                if(BOOST_DEDUCED_TYPENAME Archive::is_saving::value){
                    i = l;
                    ar & BOOST_SERIALIZATION_NVP(i);
                }
                else{
                    ar & BOOST_SERIALIZATION_NVP(i);
                    l = i;
                }
            #else
                ar & BOOST_SERIALIZATION_NVP(l);
            #endif
            ar & BOOST_SERIALIZATION_NVP(m);
            ar & BOOST_SERIALIZATION_NVP(n);
            ar & BOOST_SERIALIZATION_NVP(o);
            ar & BOOST_SERIALIZATION_NVP(p);
            ar & BOOST_SERIALIZATION_NVP(q);
            #ifndef BOOST_NO_CWCHAR
            ar & BOOST_SERIALIZATION_NVP(r);
            #endif
            ar & BOOST_SERIALIZATION_NVP(c);
            ar & BOOST_SERIALIZATION_NVP(s);
            ar & BOOST_SERIALIZATION_NVP(t);
            ar & BOOST_SERIALIZATION_NVP(u);
            ar & BOOST_SERIALIZATION_NVP(v);
            ar & BOOST_SERIALIZATION_NVP(w);
            ar & BOOST_SERIALIZATION_NVP(x);
            ar & BOOST_SERIALIZATION_NVP(y);
            #ifndef BOOST_NO_STD_WSTRING
            ar & BOOST_SERIALIZATION_NVP(z);
            #endif
        }
    #else
        template<class Archive>
        void serialize(
            Archive &ar,
            const unsigned int /* file_version */
        );
    #endif
    bool b;
    #ifndef BOOST_NO_INT64_T
    boost::int64_t f;
    boost::uint64_t g;
    #endif
    enum h {
        i = 0,
        j,
        k
    } l;
    std::size_t m;
    signed long n;
    unsigned long o;
    signed  short p;
    unsigned short q;
    #ifndef BOOST_NO_CWCHAR
    wchar_t r;
    #endif
    char c;
    signed char s;
    unsigned char t;
    signed int u;
    unsigned int v;
    float w;
    double x;
    std::string y;
    #ifndef BOOST_NO_STD_WSTRING
    std::wstring z;
    #endif
public:
    A();
    bool check_equal(const A &rhs) const;
    bool operator==(const A &rhs) const;
    bool operator!=(const A &rhs) const;
    bool operator<(const A &rhs) const; // used by less
    // hash function for class A
    operator std::size_t () const;
    friend std::ostream & operator<<(std::ostream & os, A const & a);
};

#undef DLL_DECL

#endif // BOOST_SERIALIZATION_TEST_A_HPP
