MQLplus/lib_structures/base/lib_base_node_element.mqh
super.admin 466f9ca5c5 convert
2025-05-30 16:09:52 +02:00

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