223 lines
9.4 KiB
MQL5
223 lines
9.4 KiB
MQL5
#ifndef LIB_MQLPLUS_BASE_NODE_ELEMENT_TEMPLATES_MQH_INCLUDED
|
|
#define LIB_MQLPLUS_BASE_NODE_ELEMENT_TEMPLATES_MQH_INCLUDED
|
|
#property version "1.0";
|
|
/**********************************************************************************
|
|
* Copyright (C) 2010-2022 Dominik Egert <info@freie-netze.de>
|
|
*
|
|
* This file is the objects 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.0
|
|
* State: production
|
|
*
|
|
* File information
|
|
* ================
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
#ifdef DBG_MSG_TRACE_FILE_LOADER
|
|
DBG_MSG_TRACE_FILE_LOADER;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/*********************************************************************************************************************************************************/
|
|
/* */
|
|
/* MQLplus data structures */
|
|
/* */
|
|
/*********************************************************************************************************************************************************/
|
|
|
|
|
|
|
|
///////////////////////////////////////
|
|
//
|
|
// Collection parameters
|
|
//
|
|
|
|
template <typename NODE_TYPE>
|
|
class _param_details
|
|
{
|
|
public:
|
|
// Local storage
|
|
NODE_TYPE* p_root;
|
|
NODE_TYPE* p_left;
|
|
NODE_TYPE* p_right;
|
|
NODE_TYPE* p_last_added;
|
|
int _size;
|
|
int instance_cnt;
|
|
bool do_not_destroy;
|
|
|
|
// Constructors
|
|
_param_details() :
|
|
p_root (NULL),
|
|
p_left (NULL),
|
|
p_right (NULL),
|
|
p_last_added (NULL),
|
|
_size (NULL),
|
|
instance_cnt (1),
|
|
do_not_destroy (false)
|
|
{ };
|
|
|
|
// Reset
|
|
void clear()
|
|
{
|
|
instance_cnt--;
|
|
if(instance_cnt == NULL)
|
|
{
|
|
p_root = NULL;
|
|
p_left = NULL;
|
|
p_right = NULL;
|
|
p_last_added = NULL;
|
|
_size = NULL;
|
|
do_not_destroy = false;
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////
|
|
//
|
|
// Element handler object
|
|
//
|
|
|
|
template <typename PARAM_TYPE, typename NODE_TYPE, typename USER_DATA>
|
|
class _element
|
|
{
|
|
protected:
|
|
// Local storage
|
|
PARAM_TYPE* p_params;
|
|
NODE_TYPE* p_element_obj;
|
|
|
|
// Constructors
|
|
_element() : p_params(NULL), p_element_obj(NULL) { };
|
|
_element(NODE_TYPE* p_obj, PARAM_TYPE* p_in) : p_params(p_in), p_element_obj(p_obj) { };
|
|
_element(const _element& p_in) : p_params(p_in.p_params), p_element_obj(p_in.p_element_obj) { };
|
|
|
|
public:
|
|
// Assignment Operators
|
|
void operator=(const _element& p_in) { p_params = p_in.p_params; p_element_obj = p_in.p_element_obj; };
|
|
const USER_DATA operator=(USER_DATA& p_in) { return(p_element_obj.operator=(p_in)); }
|
|
|
|
// Comparison Operators
|
|
const bool operator!=(const _element& p_in) { return(p_element_obj.get_obj() != p_in.get_obj()); };
|
|
const bool operator==(const _element& p_in) { return(p_element_obj.get_obj() == p_in.get_obj()); };
|
|
const bool operator>=(const _element& p_in) { return(p_element_obj.get_obj() >= p_in.get_obj()); };
|
|
const bool operator<=(const _element& p_in) { return(p_element_obj.get_obj() <= p_in.get_obj()); };
|
|
const bool operator>(const _element& p_in) { return(p_element_obj.get_obj() > p_in.get_obj()); };
|
|
const bool operator<(const _element& p_in) { return(p_element_obj.get_obj() < p_in.get_obj()); };
|
|
|
|
const bool operator!=(const USER_DATA& p_in) { return(p_element_obj.get_obj() != p_in); };
|
|
const bool operator==(const USER_DATA& p_in) { return(p_element_obj.get_obj() == p_in); };
|
|
const bool operator>=(const USER_DATA& p_in) { return(p_element_obj.get_obj() >= p_in); };
|
|
const bool operator<=(const USER_DATA& p_in) { return(p_element_obj.get_obj() <= p_in); };
|
|
const bool operator>(const USER_DATA& p_in) { return(p_element_obj.get_obj() > p_in); };
|
|
const bool operator<(const USER_DATA& p_in) { return(p_element_obj.get_obj() < p_in); };
|
|
|
|
// Functions
|
|
void reset() { p_element_obj = NULL; p_params = NULL; };
|
|
void set(NODE_TYPE* p_obj, PARAM_TYPE* p_in) { p_element_obj = (p_element_obj == NULL) ? p_obj : p_element_obj; p_params = (p_params == NULL) ? p_params : p_in; }
|
|
USER_DATA get_obj() const { return(p_element_obj.get_obj()); };
|
|
virtual void remove(const bool _do_not_destroy = false) = 0;
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////
|
|
//
|
|
// Element collection object
|
|
//
|
|
|
|
// Base object
|
|
template <typename USER_DATA, typename NODE_TYPE>
|
|
struct _element_collection
|
|
{
|
|
protected:
|
|
// Local storage
|
|
|
|
_param_details<NODE_TYPE>* p_params;
|
|
|
|
|
|
// Constructors / Destructor
|
|
|
|
// Default constructor
|
|
_element_collection() :
|
|
p_params (new _param_details<NODE_TYPE>())
|
|
{ };
|
|
|
|
// Copy constructor
|
|
_element_collection(const _element_collection<USER_DATA, NODE_TYPE>& p_in) :
|
|
p_params (p_in.p_params)
|
|
{ p_params.instance_cnt++; };
|
|
|
|
// Copy constructor
|
|
_element_collection(_param_details<NODE_TYPE>* p_in) :
|
|
p_params (p_in)
|
|
{ p_params.instance_cnt++; };
|
|
|
|
// Destructor
|
|
~_element_collection()
|
|
{
|
|
if( (CheckPointer(p_params) != POINTER_INVALID)
|
|
&& (p_params.instance_cnt <= 1) )
|
|
{ delete(p_params); }
|
|
};
|
|
|
|
|
|
public:
|
|
// General object functions
|
|
|
|
// Get size
|
|
const int size() const
|
|
{ return(p_params._size); }
|
|
|
|
// Last added element
|
|
USER_DATA last_added_element()
|
|
{ return(p_params.p_last_added.get_obj()); };
|
|
|
|
// Firat element
|
|
USER_DATA first_element()
|
|
{ return(p_params.p_left.get_obj()); };
|
|
|
|
// Last element
|
|
USER_DATA last_element()
|
|
{ return(p_params.p_right.get_obj()); };
|
|
|
|
// Get tree root element
|
|
USER_DATA root_element()
|
|
{ return(p_params.p_root.get_obj()); };
|
|
|
|
|
|
// Operators
|
|
|
|
// Assignment operator
|
|
void operator=(const _element_collection<USER_DATA, NODE_TYPE>& p_in)
|
|
{
|
|
// Check control structure
|
|
if(p_params.instance_cnt == NULL)
|
|
{ delete(p_params); }
|
|
|
|
// Update instance counter
|
|
p_params = p_in.p_params;
|
|
p_params.instance_cnt++;
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
//
|
|
// END MQL data structures */
|
|
//*********************************************************************************************************************************************************/
|
|
#endif // LIB_MQLPLUS_BASE_NODE_ELEMENT_TEMPLATES_MQH_INCLUDED
|