#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 * * 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 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 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 struct _element_collection { protected: // Local storage _param_details* p_params; // Constructors / Destructor // Default constructor _element_collection() : p_params (new _param_details()) { }; // Copy constructor _element_collection(const _element_collection& p_in) : p_params (p_in.p_params) { p_params.instance_cnt++; }; // Copy constructor _element_collection(_param_details* 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& 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