#ifndef LIB_MQLPLUS_STRUCTURE_UNIONS_MQH_INCLUDED #define LIB_MQLPLUS_STRUCTURE_UNIONS_MQH_INCLUDED #property version "1.2"; /********************************************************************************** * Copyright (C) 2010-2022 Dominik Egert * * This file is the unions data conversion include file. * * MQLplus, including this file may not be copied and/or distributed * without explecit permit by the author. * Author Dominik Egert / Freie Netze UG. ********************************************************************************** * * Version: 1.2 * State: production * * File information * ================ * * * */ #ifdef DBG_MSG_TRACE_FILE_LOADER DBG_MSG_TRACE_FILE_LOADER; #endif /*********************************************************************************************************************************************************/ /* */ /* MQLplus datatype conversion unions */ /* */ /*********************************************************************************************************************************************************/ // Predeclaration conversion union union _clr_transform; union _64_bit; /// 32 Bit generic conversion union /** 32 Bit conversion union data structure. Allows binary conversion of int, uint, float and color. Data can be accessed by uchar array on a byte level. Structure does not interpret float binary storage format. */ union _32_bit { // Conversion data int i; /*!< int type access varialbe i */ uint ui; /*!< unsigned int type access varialbe ui */ float f; /*!< float type access varialbe f */ color clr; /*!< color type access varialbe clr */ ushort us[2]; /*!< unsigned short type access array us[2] */ uchar uc[4]; /*!< unsigned char type access array uc[4] */ //! Constructors /*! Union structure constructors support input types for binary access. Default constructor type. Copy constructor type. Convert 64 bit to lower 32 bit constructor type int, unsigned int, float and color constructor types. Byte constructor type \param -none- \param p_in as _32_bit& reference as copy constructor \param p_in as _64_bit& reference as conversion to lower 32 bit binary \param p_in as integer datatype \param p_in as unsigned integer datatype \param p_in as color datatype \param b1 as first byte unsigned char datatype \param b2 as second byte unsigned char datatype \param b3 as third byte unsigned char datatype \param b4 as fourth byte unsigned char datatype */ _32_bit() : i (NULL) { }; _32_bit(const _32_bit& p_in) : ui (p_in.ui) { }; _32_bit(const _64_bit& p_in) : ui ((uint)p_in.ul) { }; _32_bit(const int p_in) : i (p_in) { }; _32_bit(const uint p_in) : ui (p_in) { }; _32_bit(const float p_in) : f (p_in) { }; _32_bit(const color p_in) : clr (p_in) { }; _32_bit(const ushort s1, const ushort s2 = NULL) { us[0] = s1; us[1] = s2; }; _32_bit(const ushort s1, const uchar b3 = NULL, const uchar b4 = NULL) { us[0] = s1; uc[2] = b3; uc[3] = b4; }; _32_bit(const uchar b1, const ushort s23 = NULL, const uchar b4 = NULL) { uc[0] = b1; uc[1] = (uchar)(s23 >> 8); uc[2] = (uchar)(s23); uc[3] = b4; }; _32_bit(const uchar b1, const uchar b2 = NULL, const ushort s2 = NULL) { uc[0] = b1; uc[1] = b2; us[1] = s2; }; _32_bit(const uchar b1, const uchar b2 = NULL, const uchar b3 = NULL, const uchar b4 = NULL) { uc[0] = b1; uc[1] = b2; uc[2] = b3; uc[3] = b4; }; //! Assignment operators /*! Assignment operator supports as input _clr_transform& reference to structure _32_bit& reference to structure _64_bit& reference to structure integer type assignment unsigned integer type assignment float type assignment color type assignment \param in as 4 byte value to be assigned according to its type. */ void operator=(const _clr_transform& in) { ui = in.ui; }; void operator=(const _32_bit& in) { ui = in.ui; }; void operator=(const _64_bit& in) { ui = (uint)in.ul; }; void operator=(const int in) { i = in; }; void operator=(const uint in) { ui = in; }; void operator=(const float in) { f = in; }; void operator=(const color in) { clr = in; }; // Comparison operators bool operator==(const _clr_transform& in) { return(ui == in.ui); }; bool operator==(const _32_bit& in) { return(ui == in.ui); }; bool operator==(const _64_bit& in) { return(ui == (uint)in.ul); }; bool operator==(const int in) { return(i == in); }; bool operator==(const uint in) { return(ui == in); }; bool operator==(const float in) { return(f == in); }; bool operator==(const color in) { return(clr == in); }; bool operator!=(const _clr_transform& in) { return(ui != in.ui); }; bool operator!=(const _32_bit& in) { return(ui != in.ui); }; bool operator!=(const _64_bit& in) { return(ui != (uint)in.ul); }; bool operator!=(const int in) { return(i != in); }; bool operator!=(const uint in) { return(ui != in); }; bool operator!=(const float in) { return(f != in); }; bool operator!=(const color in) { return(clr != in); }; bool operator<(const _clr_transform& in) { return(ui < in.ui); }; bool operator<(const _32_bit& in) { return(ui < in.ui); }; bool operator<(const _64_bit& in) { return(ui < (uint)in.ul); }; bool operator<(const int in) { return(i < in); }; bool operator<(const uint in) { return(ui < in); }; bool operator<(const float in) { return(f < in); }; bool operator<(const color in) { return(clr < in); }; bool operator>(const _clr_transform& in) { return(ui > in.ui); }; bool operator>(const _32_bit& in) { return(ui > in.ui); }; bool operator>(const _64_bit& in) { return(ui > (uint)in.ul); }; bool operator>(const int in) { return(i > in); }; bool operator>(const uint in) { return(ui > in); }; bool operator>(const float in) { return(f > in); }; bool operator>(const color in) { return(clr > in); }; bool operator<=(const _clr_transform& in) { return(ui <= in.ui); }; bool operator<=(const _32_bit& in) { return(ui <= in.ui); }; bool operator<=(const _64_bit& in) { return(ui <= (uint)in.ul); }; bool operator<=(const int in) { return(i <= in); }; bool operator<=(const uint in) { return(ui <= in); }; bool operator<=(const float in) { return(f <= in); }; bool operator<=(const color in) { return(clr <= in); }; bool operator>=(const _clr_transform& in) { return(ui >= in.ui); }; bool operator>=(const _32_bit& in) { return(ui >= in.ui); }; bool operator>=(const _64_bit& in) { return(ui >= (uint)in.ul); }; bool operator>=(const int in) { return(i >= in); }; bool operator>=(const uint in) { return(ui >= in); }; bool operator>=(const float in) { return(f >= in); }; bool operator>=(const color in) { return(clr >= in); }; }; // 32 Bit color structure struct _basic_clr_rgb { // Local color storage uchar red; uchar green; uchar blue; uchar alpha; }; // 32 Bit color conversion union union _clr_transform { // Conversion data int i; uint ui; float f; color clr; uchar uc[4]; // Conversion data _basic_clr_rgb rgb; // Constructors _clr_transform() : i (NULL) { }; _clr_transform( const _32_bit& p_in) : ui (p_in.ui) { }; _clr_transform( const int p_in) : i (p_in) { }; _clr_transform( const uint p_in) : ui (p_in) { }; _clr_transform( const float p_in) : f (p_in) { }; _clr_transform( const color p_in) : clr (p_in) { }; _clr_transform( const uchar _red, const uchar _green, const uchar _blue, const uchar _alpha = NULL) : clr ( (_red) + (_green << 8) + (_blue << 16) + (_alpha << 24)) { }; _clr_transform( const _clr_transform& p_in) : ui (p_in.ui) { }; // Assignment Operators void operator=(const _clr_transform& in) { ui = in.ui; }; void operator=(const _32_bit& in) { ui = in.ui; }; void operator=(const int in) { i = in; }; void operator=(const uint in) { ui = in; }; void operator=(const float in) { f = in; }; void operator=(const color in) { clr = in; }; // Comparison operators bool operator==(const _clr_transform& in) { return(ui == in.ui); }; bool operator==(const _32_bit& in) { return(ui == in.ui); }; bool operator==(const int in) { return(i == in); }; bool operator==(const uint in) { return(ui == in); }; bool operator==(const float in) { return(f == in); }; bool operator==(const color in) { return(clr == in); }; bool operator!=(const _clr_transform& in) { return(ui != in.ui); }; bool operator!=(const _32_bit& in) { return(ui != in.ui); }; bool operator!=(const int in) { return(i != in); }; bool operator!=(const uint in) { return(ui != in); }; bool operator!=(const float in) { return(f != in); }; bool operator!=(const color in) { return(clr != in); }; bool operator<(const _clr_transform& in) { return(ui < in.ui); }; bool operator<(const _32_bit& in) { return(ui < in.ui); }; bool operator<(const int in) { return(i < in); }; bool operator<(const uint in) { return(ui < in); }; bool operator<(const float in) { return(f < in); }; bool operator<(const color in) { return(clr < in); }; bool operator>(const _clr_transform& in) { return(ui > in.ui); }; bool operator>(const _32_bit& in) { return(ui > in.ui); }; bool operator>(const int in) { return(i > in); }; bool operator>(const uint in) { return(ui > in); }; bool operator>(const float in) { return(f > in); }; bool operator>(const color in) { return(clr > in); }; bool operator<=(const _clr_transform& in) { return(ui <= in.ui); }; bool operator<=(const _32_bit& in) { return(ui <= in.ui); }; bool operator<=(const int in) { return(i <= in); }; bool operator<=(const uint in) { return(ui <= in); }; bool operator<=(const float in) { return(f <= in); }; bool operator<=(const color in) { return(clr <= in); }; bool operator>=(const _clr_transform& in) { return(ui >= in.ui); }; bool operator>=(const _32_bit& in) { return(ui >= in.ui); }; bool operator>=(const int in) { return(i >= in); }; bool operator>=(const uint in) { return(ui >= in); }; bool operator>=(const float in) { return(f >= in); }; bool operator>=(const color in) { return(clr >= in); }; }; // 64 Bit conversion union union _64_bit { // Conversion data long l; ulong ul; double d; datetime dt; uint ui[2]; ushort us[4]; uchar uc[8]; // Constructors _64_bit() : l (NULL) { }; _64_bit(const _32_bit& p_in) : ul (p_in.ui) { }; _64_bit(const _64_bit& p_in) : ul (p_in.ul) { }; _64_bit(const long p_in) : l (p_in) { }; _64_bit(const ulong p_in) : ul (p_in) { }; _64_bit(const double p_in) : d (p_in) { }; _64_bit(const datetime p_in) : dt (p_in) { }; _64_bit(const uchar b1, const uchar b2 = NULL, const uchar b3 = NULL, const uchar b4 = NULL, const uchar b5 = NULL, const uchar b6 = NULL, const uchar b7 = NULL, const uchar b8 = NULL) { uc[0] = b1; uc[1] = b2; uc[2] = b3; uc[3] = b4; uc[4] = b5; uc[5] = b6; uc[6] = b7; uc[7] = b8; }; // Assignment operators void operator=(const _32_bit& in) { ul = in.ui; }; void operator=(const _64_bit& in) { ul = in.ul; }; void operator=(const long in) { l = in; }; void operator=(const ulong in) { ul = in; }; void operator=(const double in) { d = in; }; void operator=(const datetime in) { dt = in; }; // Comparison operators bool operator==(const _32_bit& in) { return(ul == (ulong)in.ui); }; bool operator==(const _64_bit& in) { return(ul == in.ul); }; bool operator==(const long in) { return(l == in); }; bool operator==(const ulong in) { return(ul == in); }; bool operator==(const double in) { return(d == in); }; bool operator==(const datetime in) { return(dt == in); }; bool operator!=(const _32_bit& in) { return(ul != (ulong)in.ui); }; bool operator!=(const _64_bit& in) { return(ul != in.ul); }; bool operator!=(const long in) { return(l != in); }; bool operator!=(const ulong in) { return(ul != in); }; bool operator!=(const double in) { return(d != in); }; bool operator!=(const datetime in) { return(dt != in); }; bool operator<(const _32_bit& in) { return(ul < (ulong)in.ui); }; bool operator<(const _64_bit& in) { return(ul < in.ul); }; bool operator<(const long in) { return(l < in); }; bool operator<(const ulong in) { return(ul < in); }; bool operator<(const double in) { return(d < in); }; bool operator<(const datetime in) { return(dt < in); }; bool operator>(const _32_bit& in) { return(ul > (ulong)in.ui); }; bool operator>(const _64_bit& in) { return(ul > in.ul); }; bool operator>(const long in) { return(l > in); }; bool operator>(const ulong in) { return(ul > in); }; bool operator>(const double in) { return(d > in); }; bool operator>(const datetime in) { return(dt > in); }; bool operator<=(const _32_bit& in) { return(ul <= (ulong)in.ui); }; bool operator<=(const _64_bit& in) { return(ul <= in.ul); }; bool operator<=(const long in) { return(l <= in); }; bool operator<=(const ulong in) { return(ul <= in); }; bool operator<=(const double in) { return(d <= in); }; bool operator<=(const datetime in) { return(dt <= in); }; bool operator>=(const _32_bit& in) { return(ul >= (ulong)in.ui); }; bool operator>=(const _64_bit& in) { return(ul >= in.ul); }; bool operator>=(const long in) { return(l >= in); }; bool operator>=(const ulong in) { return(ul >= in); }; bool operator>=(const double in) { return(d >= in); }; bool operator>=(const datetime in) { return(dt >= in); }; }; // Templated conversion union template union _T_bit { // Conversion data T _int; unsigned T _uint; U _flt; uchar _uc[sizeof(T) > sizeof(U) ? sizeof(T) : sizeof(U)]; // Constructors _T_bit() : _int (NULL) { }; _T_bit(const _T_bit& p_in) : _uint ((T)p_in._uint) { }; _T_bit(const _32_bit& p_in) : _uint ((T)p_in.ui) { }; _T_bit(const _64_bit& p_in) : _uint ((T)p_in.ul) { }; _T_bit(const char p_in) : _uint ((T)p_in) { }; _T_bit(const uchar p_in) : _uint ((unsigned T)p_in) { }; _T_bit(const short p_in) : _uint ((T)p_in) { }; _T_bit(const ushort p_in) : _uint ((unsigned T)p_in) { }; _T_bit(const int p_in) : _uint ((T)p_in) { }; _T_bit(const uint p_in) : _uint ((unsigned T)p_in) { }; _T_bit(const float p_in) : _flt ((U)p_in) { }; _T_bit(const color p_in) : _uint ((T)p_in) { }; _T_bit(const long p_in) : _uint ((T)p_in) { }; _T_bit(const ulong p_in) : _uint ((unsigned T)p_in) { }; _T_bit(const double p_in) : _flt ((U)p_in) { }; _T_bit(const datetime p_in) : _uint ((T)p_in) { }; _T_bit(const uchar& b_in[]) : _int (NULL) { ::ArrayCopy(_uc, b_in, 0, sizeof(T)); }; // Assignment operators void operator=(const _32_bit& in) { _int = (T) in.ui; }; void operator=(const _64_bit& in) { _int = (T) in.ul; }; void operator=(const _T_bit& in) { _int = (T) in._int; }; void operator=(const char in) { _int = (T) in; }; void operator=(const uchar in) { _uint = (unsigned T)in; }; void operator=(const short in) { _int = (T) in; }; void operator=(const ushort in) { _uint = (unsigned T)in; }; void operator=(const int in) { _int = (T) in; }; void operator=(const uint in) { _uint = (unsigned T)in; }; void operator=(const float in) { _flt = (U) in; }; void operator=(const color in) { _int = (T) in; }; void operator=(const long in) { _int = (T) in; }; void operator=(const ulong in) { _uint = (unsigned T)in; }; void operator=(const double in) { _flt = (U) in; }; void operator=(const datetime in) { _int = (T) in; }; // Comparison operators bool operator==(const _T_bit& in) { return(_int == in._int); }; bool operator==(const _32_bit& in) { return(_int == (T)in.i); }; bool operator==(const _64_bit& in) { return(_int == (T)in.l); }; bool operator==(const char in) { return((char)_int == in); }; bool operator==(const uchar in) { return((uchar)_uint == in); }; bool operator==(const short in) { return((short)_int == in); }; bool operator==(const ushort in) { return((ushort)_uint == in); }; bool operator==(const int in) { return((int)_int == in); }; bool operator==(const uint in) { return((uint)_uint == in); }; bool operator==(const float in) { return((float)_flt == in); }; bool operator==(const color in) { return((color)_int == in); }; bool operator==(const long in) { return((long)_int == in); }; bool operator==(const ulong in) { return((ulong)_uint == in); }; bool operator==(const double in) { return((double)_flt == in); }; bool operator==(const datetime in) { return((datetime)_int == in); }; bool operator!=(const _T_bit& in) { return(_int != in._int); }; bool operator!=(const _32_bit& in) { return(_int != (T)in.i); }; bool operator!=(const _64_bit& in) { return(_int != (T)in.l); }; bool operator!=(const char in) { return((char)_int != in); }; bool operator!=(const uchar in) { return((uchar)_uint != in); }; bool operator!=(const short in) { return((short)_int != in); }; bool operator!=(const ushort in) { return((ushort)_uint != in); }; bool operator!=(const int in) { return((int)_int != in); }; bool operator!=(const uint in) { return((uint)_uint != in); }; bool operator!=(const float in) { return((float)_flt != in); }; bool operator!=(const color in) { return((color)_int != in); }; bool operator!=(const long in) { return((long)_int != in); }; bool operator!=(const ulong in) { return((ulong)_uint != in); }; bool operator!=(const double in) { return((double)_flt != in); }; bool operator!=(const datetime in) { return((datetime)_int != in); }; bool operator<(const _T_bit& in) { return(_int < in._int); }; bool operator<(const _32_bit& in) { return(_int < (T)in.i); }; bool operator<(const _64_bit& in) { return(_int < (T)in.l); }; bool operator<(const char in) { return((char)_int < in); }; bool operator<(const uchar in) { return((uchar)_uint < in); }; bool operator<(const short in) { return((short)_int < in); }; bool operator<(const ushort in) { return((ushort)_uint < in); }; bool operator<(const int in) { return((int)_int < in); }; bool operator<(const uint in) { return((uint)_uint < in); }; bool operator<(const float in) { return((float)_flt < in); }; bool operator<(const color in) { return((color)_int < in); }; bool operator<(const long in) { return((long)_int < in); }; bool operator<(const ulong in) { return((ulong)_uint < in); }; bool operator<(const double in) { return((double)_flt < in); }; bool operator<(const datetime in) { return((datetime)_int < in); }; bool operator>(const _T_bit& in) { return(_int > in._int); }; bool operator>(const _32_bit& in) { return(_int > (T)in.i); }; bool operator>(const _64_bit& in) { return(_int > (T)in.l); }; bool operator>(const char in) { return((char)_int > in); }; bool operator>(const uchar in) { return((uchar)_uint > in); }; bool operator>(const short in) { return((short)_int > in); }; bool operator>(const ushort in) { return((ushort)_uint > in); }; bool operator>(const int in) { return((int)_int > in); }; bool operator>(const uint in) { return((uint)_uint > in); }; bool operator>(const float in) { return((float)_flt > in); }; bool operator>(const color in) { return((color)_int > in); }; bool operator>(const long in) { return((long)_int > in); }; bool operator>(const ulong in) { return((ulong)_uint > in); }; bool operator>(const double in) { return((double)_flt > in); }; bool operator>(const datetime in) { return((datetime)_int > in); }; bool operator<=(const _T_bit& in) { return(_int <= in._int); }; bool operator<=(const _32_bit& in) { return(_int <= (T)in.i); }; bool operator<=(const _64_bit& in) { return(_int <= (T)in.l); }; bool operator<=(const char in) { return((char)_int <= in); }; bool operator<=(const uchar in) { return((uchar)_uint <= in); }; bool operator<=(const short in) { return((short)_int <= in); }; bool operator<=(const ushort in) { return((ushort)_uint <= in); }; bool operator<=(const int in) { return((int)_int <= in); }; bool operator<=(const uint in) { return((uint)_uint <= in); }; bool operator<=(const float in) { return((float)_flt <= in); }; bool operator<=(const color in) { return((color)_int <= in); }; bool operator<=(const long in) { return((long)_int <= in); }; bool operator<=(const ulong in) { return((ulong)_uint <= in); }; bool operator<=(const double in) { return((double)_flt <= in); }; bool operator<=(const datetime in) { return((datetime)_int <= in); }; bool operator>=(const _T_bit& in) { return(_int >= in._int); }; bool operator>=(const _32_bit& in) { return(_int >= (T)in.i); }; bool operator>=(const _64_bit& in) { return(_int >= (T)in.l); }; bool operator>=(const char in) { return((char)_int >= in); }; bool operator>=(const uchar in) { return((uchar)_uint >= in); }; bool operator>=(const short in) { return((short)_int >= in); }; bool operator>=(const ushort in) { return((ushort)_uint >= in); }; bool operator>=(const int in) { return((int)_int >= in); }; bool operator>=(const uint in) { return((uint)_uint >= in); }; bool operator>=(const float in) { return((float)_flt >= in); }; bool operator>=(const color in) { return((color)_int >= in); }; bool operator>=(const long in) { return((long)_int >= in); }; bool operator>=(const ulong in) { return((ulong)_uint >= in); }; bool operator>=(const double in) { return((double)_flt >= in); }; bool operator>=(const datetime in) { return((datetime)_int >= in); }; }; // // END MQL data structures */ //*********************************************************************************************************************************************************/ #endif // LIB_MQLPLUS_STRUCTURE_UNIONS_MQH_INCLUDED