MQLplus/lib_structures/nodes/lib_obj_node_tree_binary.mqh

237 lines
12 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 16:09:52 +02:00
#ifndef LIB_MQLPLUS_OBJECT_TREE_NODE_MQH_INCLUDED
#define LIB_MQLPLUS_OBJECT_TREE_NODE_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
// Incluse base object
#include "lib_base_obj_node_tree_binary.mqh"
/*********************************************************************************************************************************************************/
/* */
/* MQLplus data structures */
/* */
/*********************************************************************************************************************************************************/
///////////////////////////////////////
//
// Object Tree Node
//
// Data holding object
// Derived simple type class object
#define NODE_SUBTYPE _object_binary_t_node<USER_DATA>
#define NODE_TYPE object_tree_node<USER_DATA>
template <typename USER_DATA>
class object_tree_node : protected NODE_SUBTYPE
{
public:
// Constructors / Destructor
// Default constructor
object_tree_node() : NODE_SUBTYPE() { };
// Copy constructor
object_tree_node(const NODE_TYPE& p_in) { NODE_SUBTYPE(p_in); };
// Value constructor
object_tree_node(USER_DATA& p_in) { this_obj = p_in; };
// Destructor
~object_tree_node() { };
// Element selectors
// Root tree element
NODE_TYPE* root_element() { return((NODE_TYPE*)NODE_SUBTYPE::root()); };
// Root tree element
NODE_TYPE* lowest_element() { return((NODE_TYPE*)NODE_SUBTYPE::left()); };
// Root tree element
NODE_TYPE* highest_element() { return((NODE_TYPE*)NODE_SUBTYPE::right()); };
// Parent tree element
NODE_TYPE* parent_element() { return((NODE_TYPE*)_parent); };
// Left leaf element
NODE_TYPE* left_element() { return((NODE_TYPE*)_left); };
// Right leaf element
NODE_TYPE* right_element() { return((NODE_TYPE*)_right); };
// Tree element functions
// Insert element
NODE_TYPE* insert(NODE_TYPE* p_root) { return((NODE_TYPE*)NODE_SUBTYPE::insert(p_root)); };
// Get key value
USER_DATA get_key() const { return(this_obj); };
// Get object
USER_DATA get_obj() const { return(this_obj); };
// Detach object
USER_DATA detach_obj() { return(this_obj); };
// Remove object from tree
NODE_TYPE* remove(NODE_TYPE* p_root, const bool do_not_delete = false) { return((NODE_TYPE*)NODE_SUBTYPE::remove(p_root)); };
// Smallest node by key
NODE_TYPE* smallest_node() { return((NODE_TYPE*)NODE_SUBTYPE::_subtree_smallest_key((_parent != NULL) ? _parent : (NODE_SUBTYPE*)::GetPointer(this))); }
// Greatest node by key
NODE_TYPE* greatest_node() { return((NODE_TYPE*)NODE_SUBTYPE::_subtree_greatest_key((_parent != NULL) ? _parent : (NODE_SUBTYPE*)::GetPointer(this))); }
// Operators
// Value assignment operator
const USER_DATA operator=(USER_DATA& p_in) { this_obj = p_in; return(this_obj); };
// Access operator
NODE_TYPE* operator[](USER_DATA& p_in) { return((NODE_TYPE*)NODE_SUBTYPE::operator[](p_in)); };
// Copy assignment operator
void operator=(const NODE_TYPE& p_in) { NODE_SUBTYPE::operator=((NODE_SUBTYPE)p_in); };
// Debugging helper
const string _node_to_string(int& count) { return(NODE_SUBTYPE::_node_to_string(count)); };
};
#undef NODE_TYPE
#undef NODE_SUBTYPE
// Derived complex type class object for pointers
#define NODE_SUBTYPE _object_binary_t_node<USER_DATA*>
#define NODE_TYPE ptr_object_tree_node<USER_DATA>
template <typename USER_DATA>
class ptr_object_tree_node : protected NODE_SUBTYPE
{
public:
// Constructors / Destructor
// Default constructor
ptr_object_tree_node() : NODE_SUBTYPE() { };
// Copy constructor
ptr_object_tree_node(const NODE_TYPE& p_in) { NODE_SUBTYPE(p_in); };
// Value constructor
ptr_object_tree_node(const USER_DATA& p_in) { this_obj = new USER_DATA(p_in); };
ptr_object_tree_node(USER_DATA* p_in) { this_obj = p_in; };
// Destructor
~ptr_object_tree_node() { if((this_obj != NULL) && (CheckPointer(this_obj) == POINTER_DYNAMIC)) { delete(this_obj); } };
// Element selectors
// Root tree element
NODE_TYPE* root_element() { return((NODE_TYPE*)root()); };
// Root tree element
NODE_TYPE* lowest_element() { return((NODE_TYPE*)left()); };
// Root tree element
NODE_TYPE* highest_element() { return((NODE_TYPE*)right()); };
// Parent tree element
NODE_TYPE* parent_element() { return((NODE_TYPE*)_parent); };
// Left leaf element
NODE_TYPE* left_element() { return((NODE_TYPE*)_left); };
// Right leaf element
NODE_TYPE* right_element() { return((NODE_TYPE*)_right); };
// Tree element functions
// Insert element
NODE_TYPE* insert(NODE_TYPE* p_root) { return(NODE_SUBTYPE::insert(p_root)); };
// Get key value
USER_DATA* get_key() { return(this_obj); };
// Get object
USER_DATA* get_obj() { return(this_obj); };
// Detach object
USER_DATA* detach_obj() { USER_DATA* tmp = this_obj; this_obj = NULL; return(tmp); }
// Remove object from tree
NODE_TYPE* remove(NODE_TYPE* p_root, const bool do_not_delete = false) { if(do_not_delete) { detach_obj(); }; return(NODE_SUBTYPE::remove(p_root)); };
// Smallest node by key
NODE_TYPE* smallest_node() { return((NODE_TYPE*)NODE_SUBTYPE::_subtree_smallest_key((_parent != NULL) ? _parent : (NODE_SUBTYPE*)::GetPointer(this))); }
// Greatest node by key
NODE_TYPE* greatest_node() { return((NODE_TYPE*)NODE_SUBTYPE::_subtree_greatest_key((_parent != NULL) ? _parent : (NODE_SUBTYPE*)::GetPointer(this))); }
// Operators
// Value assignment operator
const USER_DATA* operator=(USER_DATA& p_in) { this_obj = new USER_DATA(p_in); return(this_obj); };
const USER_DATA* operator=(USER_DATA* p_in) { this_obj = p_in; return(this_obj); };
// Access operator
NODE_TYPE* operator[](USER_DATA& p_in) { USER_DATA* tmp_ptr = ::GetPointer(p_in); return((NODE_TYPE*)NODE_SUBTYPE::operator[](tmp_ptr)); };
NODE_TYPE* operator[](USER_DATA* p_in) { return((NODE_TYPE*)NODE_SUBTYPE::operator[](p_in)); };
// Copy assignment operator
void operator=(const NODE_TYPE& p_in) { NODE_SUBTYPE::operator=((NODE_SUBTYPE)p_in); };
// Debugging helper
const string _node_to_string(int& count) { return(NODE_SUBTYPE::_node_to_string(count)); };
};
#undef NODE_TYPE
#undef NODE_SUBTYPE
//
// END MQL data structures */
//*********************************************************************************************************************************************************/
#endif // LIB_MQLPLUS_OBJECT_TREE_NODE_MQH_INCLUDED