30.11.2013 - New PICollection namespace, Android support, my own PIVector implementation

This commit is contained in:
peri4
2013-11-30 19:34:53 +04:00
parent ec5530053a
commit f50891b376
64 changed files with 5466 additions and 3392 deletions

View File

@@ -1,8 +1,8 @@
/*! \file piincludes.h
* \brief Global includes of PIP
*
* This file include all needed STL and declare many useful
* macros and functions
* This file include all needed system headers, STL
* and declare many useful macros and functions
*/
/*
PIP - Platform Independent Primitives
@@ -27,7 +27,7 @@
#define PIINCLUDES_H
//! Version of PIP in hex - 0x##(Major)##(Minor)##(Revision)
#define PIP_VERSION 0x000306
#define PIP_VERSION 0x000307
//! Major value of PIP version
#define PIP_VERSION_MAJOR (PIP_VERSION & 0xFF0000) >> 16
@@ -39,7 +39,7 @@
#define PIP_VERSION_REVISION PIP_VERSION & 0xFF
//! Suffix of PIP version
#define PIP_VERSION_SUFFIX "_r3"
#define PIP_VERSION_SUFFIX ""
#ifdef DOXYGEN
@@ -58,6 +58,9 @@
//! Macro is defined when host is Mac OS
# define MAC_OS
//! Macro is defined when host is Android
# define ANDROID
//! Macro is defined when host is any Linux
# define LINUX
@@ -76,6 +79,9 @@
//! Macro is defined when PIP use "rt" library for timers implementation
# define PIP_TIMER_RT
//! Define this macro to use STL implementation of containers, else PIP implementation will be used
# define PIP_CONTAINERS_STL
#endif
#if defined(WIN32) || defined(WIN64) || defined(_WIN32) || defined(_WIN64) || defined(__WIN32__) || defined(__WIN64__)
@@ -90,11 +96,18 @@
#if defined(__APPLE__) || defined(__MACH__)
# define MAC_OS
#endif
#if defined(__ANDROID__) || defined(_ANDROID_) || defined(ANDROID)
# ifndef ANDROID
# define ANDROID
# endif
#endif
#ifndef WINDOWS
# ifndef QNX
# ifndef FREE_BSD
# ifndef MAC_OS
# define LINUX
# ifndef ANDROID
# define LINUX
# endif
# endif
# endif
# endif
@@ -106,10 +119,15 @@
# ifdef LINUX
# define HAS_LOCALE
# endif
# pragma GCC diagnostic ignored "-Wformat"
# pragma GCC diagnostic ignored "-Wformat-extra-args"
# pragma GCC diagnostic ignored "-Wstrict-aliasing"
# endif
# ifdef ANDROID
# pragma GCC diagnostic ignored "-Wunused-parameter"
# pragma GCC diagnostic ignored "-Wextra"
# pragma GCC diagnostic ignored "-Wliteral-suffix"
# endif
# pragma GCC diagnostic ignored "-Wformat"
# pragma GCC diagnostic ignored "-Wformat-extra-args"
# pragma GCC diagnostic ignored "-Wstrict-aliasing"
#elif defined(_MSC_VER)
# define CC_VC
# pragma warning(disable: 4061)
@@ -212,13 +230,17 @@
# include <fcntl.h>
# include <sys/ioctl.h>
# include <net/if.h>
# include <ifaddrs.h>
# ifdef QNX
# include <net/if_dl.h>
# include <hw/nicinfo.h>
# include <sys/dcmd_io-net.h>
# include <pthread.h>
# ifndef ANDROID
# include <ifaddrs.h>
# endif
#endif
#ifdef ANDROID
# include "ifaddrs_3rd.h"
# define tcdrain(fd) ioctl(fd, TCSBRK, 1)
inline int wctomb(char * c, wchar_t w) {*c = ((char * )&w)[0]; return 1;}
inline int mbtowc(wchar_t * w, const char * c, size_t) {*w = ((wchar_t * )&c)[0]; return 1;}
#endif
#ifdef MAC_OS
# include <mach/mach_traps.h>
# include <mach/mach.h>
@@ -228,14 +250,8 @@
typedef long time_t;
extern clock_serv_t __pi_mac_clock;
#endif
#ifndef QNX
# ifndef WINDOWS
# ifndef FREE_BSD
# ifndef MAC_OS
# define environ __environ
# endif
# endif
# endif
#ifdef LINUX
# define environ __environ
#endif
#if !defined(WINDOWS) && !defined(MAC_OS)
# define PIP_TIMER_RT
@@ -289,7 +305,7 @@ template<typename T> inline void piSwap(T & f, T & s) {T t = f; f = s; s = t;}
/*! \brief Templated function return round of float falue
* \details Round is the nearest integer value \n
* There is some macros:
* There are some macros:
* - \c piRoundf for "float"
* - \c piRoundd for "double"
*
@@ -299,7 +315,7 @@ template<typename T> inline int piRound(const T & v) {return int(v >= T(0.) ? v
/*! \brief Templated function return floor of float falue
* \details Floor is the largest integer that is not greater than value \n
* There is some macros:
* There are some macros:
* - \c piFloorf for "float"
* - \c piFloord for "double"
*
@@ -309,7 +325,7 @@ template<typename T> inline int piFloor(const T & v) {return v < T(0) ? int(v) -
/*! \brief Templated function return ceil of float falue
* \details Ceil is the smallest integer that is not less than value \n
* There is some macros:
* There are some macros:
* - \c piCeilf for "float"
* - \c piCeild for "double"
*
@@ -319,7 +335,7 @@ template<typename T> inline int piCeil(const T & v) {return v < T(0) ? int(v) :
/*! \brief Templated function return absolute of numeric falue
* \details Absolute is the positive or equal 0 value \n
* There is some macros:
* There are some macros:
* - \c piAbss for "short"
* - \c piAbsi for "int"
* - \c piAbsl for "long"
@@ -332,7 +348,7 @@ template<typename T> inline int piCeil(const T & v) {return v < T(0) ? int(v) :
template<typename T> inline T piAbs(const T & v) {return (v >= T(0) ? v : -v);}
/*! \brief Templated function return minimum of two values
* \details There is some macros:
* \details There are some macros:
* - \c piMins for "short"
* - \c piMini for "int"
* - \c piMinl for "long"
@@ -345,7 +361,7 @@ template<typename T> inline T piAbs(const T & v) {return (v >= T(0) ? v : -v);}
template<typename T> inline T piMin(const T & f, const T & s) {return ((f > s) ? s : f);}
/*! \brief Templated function return minimum of tree values
* \details There is some macros:
* \details There are some macros:
* - \c piMins for "short"
* - \c piMini for "int"
* - \c piMinl for "long"
@@ -358,7 +374,7 @@ template<typename T> inline T piMin(const T & f, const T & s) {return ((f > s) ?
template<typename T> inline T piMin(const T & f, const T & s, const T & t) {return ((f < s && f < t) ? f : ((s < t) ? s : t));}
/*! \brief Templated function return maximum of two values
* \details There is some macros:
* \details There are some macros:
* - \c piMaxs for "short"
* - \c piMaxi for "int"
* - \c piMaxl for "long"
@@ -371,7 +387,7 @@ template<typename T> inline T piMin(const T & f, const T & s, const T & t) {retu
template<typename T> inline T piMax(const T & f, const T & s) {return ((f < s) ? s : f);}
/*! \brief Templated function return maximum of tree values
* \details There is some macros:
* \details There are some macros:
* - \c piMaxs for "short"
* - \c piMaxi for "int"
* - \c piMaxl for "long"
@@ -385,7 +401,7 @@ template<typename T> inline T piMax(const T & f, const T & s, const T & t) {retu
/*! \brief Templated function return clamped value
* \details Clamped is the not greater than "max" and not lesser than "min" value \n
* There is some macros:
* There are some macros:
* - \c piClamps for "short"
* - \c piClampi for "int"
* - \c piClampl for "long"
@@ -457,7 +473,12 @@ inline double round(const double & v) {return floor(v + 0.5);}
# endif
#endif
inline ushort letobe_s(ushort v) {return v = (v << 8) | (v >> 8);}
inline ushort letobe_s(ushort v) {return (v << 8) | (v >> 8);}
inline uint letobe_i(uint v) {return (v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | ((v << 24) & 0xFF000000);}
//inline ullong letobe_ll(ullong v) {return (v >> 56) | ((v >> 40) & 0xFF00L) | ((v >> 24) & 0xFF0000L) | ((v >> 8) & 0xFF000000L) | ((v << 8) & 0xFF00000000L) | ((v << 24) & 0xFF0000000000L) | ((v << 40) & 0xFF000000000000L) | ((v << 56) & 0xFF00000000000000L);}
inline void letobe_s(ushort * v) {*v = letobe_s(*v);}
inline void letobe_i(uint * v) {*v = letobe_i(*v);}
//inline void letobe_ll(ullong * v) {*v = letobe_ll(*v);}
inline bool atob(const string & str) {return str == "1" ? true : false;}
inline string btos(const bool num) {return num ? "0" : "1";}
inline string itos(const int num) {
@@ -635,12 +656,20 @@ private:
int flags;
};
//! Macro used for conditional (piDebug) output to PICout
#define piCout if (piDebug) PICout()
#ifdef DOXYGEN
//! Macro used for conditional (piDebug and PIObject::debug()) output to PICout for subclasses of PIObject
#define piCoutObj if (piDebug && debug_) PICout() << (PIString("[") + debugName() + " \"" + name() + "\"]")
//! \brief Macro used for conditional (piDebug) output to PICout
# define piCout
//! \relatesalso PIObject \brief Macro used for conditional (piDebug and PIObject::debug()) output to PICout for subclasses of PIObject
# define piCoutObj
#else
# define piCout if (piDebug) PICout()
# define piCoutObj if (piDebug && debug_) PICout() << "" << (PIString("[") + className() + " \"" + name() + "\"]")
#endif
class PIObject;
class PIMutex;
extern PIMutex __PICout_mutex__;
@@ -658,10 +687,13 @@ namespace PICoutManipulators {
//! \brief Enum contains immediate action
enum PIP_EXPORT PICoutAction {
Flush /*! Flush the output */,
Backspace /*! Remove last symbol */,
ShowCursor /*! Show cursor */,
HideCursor /*! Hide cursor */
Flush /*! Flush the output */,
Backspace /*! Remove last symbol */,
ShowCursor /*! Show cursor */,
HideCursor /*! Hide cursor */,
ClearScreen /*! Clear the screen */,
SaveContol /*! Save control flags, equivalent to \a saveControl() */,
RestoreControl /*! Restore control flags, equivalent to \a restoreControl() */
};
//! \brief Enum contains control of PICout
@@ -710,7 +742,7 @@ typedef PIFlags<PICoutControl> PICoutControls;
class PIP_EXPORT PICout {
public:
//! Default constructor with default features
//! Default constructor with default features (AddSpaces and AddNewLine)
PICout(PIFlags<PICoutControl> controls = AddSpaces | AddNewLine);
PICout(const PICout & other): fo_(other.fo_), cc_(true), fc_(false), cnb_(other.cnb_), attr_(other.attr_), co_(other.co_) {;}
@@ -759,9 +791,13 @@ public:
PICout operator <<(const float v);
//! Output operator for <tt>"double"</tt> values
PICout operator <<(const double v);
//! Output operator for pointers
PICout operator <<(const double v);
PICout operator <<(const void * v);
//! Output operator for PIObject and ancestors
PICout operator <<(const PIObject * v);
//! Output operator for \a PICoutSpecialChar values
PICout operator <<(const PICoutSpecialChar v) {