Files
qse/qse/include/qse/Types.hpp

259 lines
7.9 KiB
C++

/*
* $Id$
*
Copyright (c) 2006-2019 Chung, Hyung-Hwan. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _QSE_TYPES_HPP_
#define _QSE_TYPES_HPP_
/// \file
/// Defines aliases to various QSE types in a class and holds various feature
/// configuration options.
#include <qse/types.h>
#include <qse/macros.h>
#if (__cplusplus >= 201103L) || (defined(_MSC_VER) && _MSC_VER >= 1900) // C++11 or later
#define QSE_LANG_CPP11 1
#define QSE_CPP_NOEXCEPT noexcept(true)
#define QSE_CPP_THREXCEPT1(e1) throw(e1)
#define QSE_CPP_THREXCEPT2(e1,e2) throw(e1,e2)
#define QSE_CPP_THREXCEPT3(e1,e2,e3) throw(e1,e2,e3)
#define QSE_CPP_THREXCEPT4(e1,e2,e3,e4) throw(e1,e2,e3,e4)
#define QSE_CPP_THREXCEPT5(e1,e2,e3,e4,e5) throw(e1,e2,e3,e4,e5)
#define QSE_CPP_EXPLICIT explicit
/// The QSE_CPP_ENABLE_CPP11_MOVE macro enables C++11 move semantics
/// in various classes.
#define QSE_CPP_ENABLE_CPP11_MOVE 1
// The QSE_CPP_CALL_DESTRUCTOR() macro calls a destructor explicitly.
#define QSE_CPP_CALL_DESTRUCTOR(ptr, class_name) ((ptr)->~class_name())
// The QSE_CPP_CALL_PLACEMENT_DELETE1() macro calls the global operator delete
// with 1 extra argument given.
#define QSE_CPP_CALL_PLACEMENT_DELETE1(ptr, arg1) (::operator delete((ptr), (arg1)))
#define QSE_CPP_TEMPLATE_QUALIFIER template
#elif (__cplusplus >= 199711L) // C++98
#undef QSE_LANG_CPP11
#define QSE_CPP_NOEXCEPT throw()
#define QSE_CPP_THREXCEPT1(e1) throw(e1)
#define QSE_CPP_THREXCEPT2(e1,e2) throw(e1,e2)
#define QSE_CPP_THREXCEPT3(e1,e2,e3) throw(e1,e2,e3)
#define QSE_CPP_THREXCEPT4(e1,e2,e3,e4) throw(e1,e2,e3,e4)
#define QSE_CPP_THREXCEPT5(e1,e2,e3,e4,e5) throw(e1,e2,e3,e4,e5)
#define QSE_CPP_EXPLICIT
#define QSE_CPP_CALL_DESTRUCTOR(ptr, class_name) ((ptr)->~class_name())
#define QSE_CPP_CALL_PLACEMENT_DELETE1(ptr, arg1) (::operator delete((ptr), (arg1)))
#define QSE_CPP_TEMPLATE_QUALIFIER template
#else
#define QSE_CPP_NOEXCEPT
#define QSE_CPP_THREXCEPT1(e1)
#define QSE_CPP_THREXCEPT2(e1,e2)
#define QSE_CPP_THREXCEPT3(e1,e2,e3)
#define QSE_CPP_THREXCEPT4(e1,e2,e3,e4)
#define QSE_CPP_THREXCEPT5(e1,e2,e3,e4,e5)
#define QSE_CPP_EXPLICIT
#if defined(__BORLANDC__)
// Explicit destructor call requires a class name depending on the
// C++ standard/compiler.
//
// Node* x;
// x->~Node ();
//
// While x->~Node() is ok with modern compilers, some old compilers
// like BCC55 required the class name in the call as shown below.
//
// x->Node::~Node ();
#define QSE_CPP_CALL_DESTRUCTOR(ptr, class_name) ((ptr)->class_name::~class_name())
#define QSE_CPP_CALL_PLACEMENT_DELETE1(ptr, arg1) (::operator delete((ptr), (arg1)))
#define QSE_CPP_TEMPLATE_QUALIFIER template
#elif defined(__WATCOMC__)
// WATCOM has a problem with this syntax.
// Node* x; x->Node::~Node().
// But it doesn't support operator delete overloading.
#define QSE_CPP_CALL_DESTRUCTOR(ptr, class_name) ((ptr)->~class_name())
#define QSE_CPP_CALL_PLACEMENT_DELETE1(ptr, arg1) (::qse_operator_delete((ptr), (arg1)))
// When the name of a member template specialization appears after . or
// -> in a postfix-expression, or after :: in a qualified-id that explic-
// itly depends on a template-argument (_temp.dep_), the member template
// name must be prefixed by the keyword template. Otherwise the name is
// assumed to name a non-template. [Example:
// class X {
// public:
// template<size_t> X* alloc();
// };
// void f(X* p)
// {
// X* p1 = p->alloc<200>();
// // ill-formed: < means less than
// X* p2 = p->template alloc<200>();
// // fine: < starts explicit qualification
// }
// --end example]
//
// WATCOM doesn't support this qualifier.
#define QSE_CPP_TEMPLATE_QUALIFIER
#define QSE_CPP_NO_OPERATOR_DELETE_OVERLOADING 1
#else
#define QSE_CPP_CALL_DESTRUCTOR(ptr, class_name) ((ptr)->~class_name())
#define QSE_CPP_CALL_PLACEMENT_DELETE1(ptr, arg1) (::operator delete((ptr), (arg1)))
#define QSE_CPP_TEMPLATE_QUALIFIER template
#endif
#endif
#if defined(QSE_CPP_ENABLE_CPP11_MOVE)
template<typename T> struct QSE_CPP_RMREF { typedef T Type; };
template<typename T> struct QSE_CPP_RMREF<T&> { typedef T Type; };
template<typename T> struct QSE_CPP_RMREF<T&&> { typedef T Type; };
template<typename T> inline
typename QSE_CPP_RMREF<T>::Type&& QSE_CPP_RVREF(T&& v)
{
return (typename QSE_CPP_RMREF<T>::Type&&)v;
}
#else
/*
template<typename T> inline
T& QSE_CPP_RVREF(T& v) { return (T&)v; }
template<typename T> inline
const T& QSE_CPP_RVREF(const T& v) { return (const T&)v; }
*/
#define QSE_CPP_RVREF(x) x
#endif
/////////////////////////////////
QSE_BEGIN_NAMESPACE(QSE)
/////////////////////////////////
/**
* The Types class defines handy aliases for various QSE types.
*/
class QSE_EXPORT Types
{
public:
/** boolean data type */
typedef qse_bool_t bool_t;
/** data type that can hold any character */
typedef qse_char_t char_t;
/** data type that can hold an unsigned char_t value */
typedef qse_chau_t chau_t;
/** data type that can hold any character or an end-of-file value */
typedef qse_cint_t cint_t;
/** redefines an unsigned integer number of the same size as void* */
typedef qse_size_t size_t;
/** signed version of size_t */
typedef qse_ssize_t ssize_t;
/** redefines qse_long_t */
typedef qse_long_t long_t;
/** redefines qse_ulong_t */
typedef qse_ulong_t ulong_t;
/** redefines qse_intptr_t */
typedef qse_intptr_t intptr_t;
/** redefines qse_uintptr_t */
typedef qse_uintptr_t uintptr_t;
/** redefines qse_intmax_t */
typedef qse_intmax_t intmax_t;
/** redefines qse_uintmax_t */
typedef qse_uintmax_t uintmax_t;
/** redefines a floating-point number */
typedef qse_flt_t flt_t;
/** redefines a structure of a character pointer and length */
typedef qse_cstr_t cstr_t;
/** redefines a structure of a character pointer and length */
typedef qse_wcstr_t wcstr_t;
/** redefines a structure of a character pointer and length */
typedef qse_mcstr_t mcstr_t;
/** defines common error codes */
enum ErrorNumber
{
/* [NOTE] if you change items here, you must change the stock error description in TypesErrorNumberToStr::operator() */
E_ENOERR, /**< no error */
E_EOTHER, /**< other error */
E_ENOIMPL, /**< not implemented */
E_ESYSERR, /**< subsystem error */
E_EINTERN, /**< internal error */
E_ENOMEM,
E_ENARGS, /**< wrong number of arguments */
E_EINVAL,
E_EACCES,
E_EPERM,
E_ENOENT,
E_EEXIST,
E_ENOTDIR,
E_EINTR,
E_EPIPE,
E_EINPROG, /* in progress */
E_EAGAIN, /* resource unavailable unavailable */
E_EEXCEPT /**< exception */
};
};
/////////////////////////////////
QSE_END_NAMESPACE(QSE)
/////////////////////////////////
#endif