home bbs files messages ]

Forums before death by AOL, social media and spammers... "We can't have nice things"

   comp.lang.c++.moderated      Moderated discussion of C++ superhackery      33,346 messages   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]

   Message 33,104 of 33,346   
   Frank Bergemann to All   
   Re: Access Data Items In Ancestor Stack    
   12 Jun 13 05:50:59   
   
   a5eec0be   
   ca86d5a4   
   From: frank67x@googlemail.com   
      
   Here's the final version - pls. see below. But it's just an example.   
   Maybe for other algorithms it will be more usable.   
   best regards,   
   Frank   
   ================= StackAccess.h ======================   
   #ifndef STACKACCESS_H_   
   #define STACKACCESS_H_   
      
   #include  // std::mem_fn   
      
   struct Nop   
   {   
      
   };   
      
   template    
   struct Func_Impl   
   {   
         typedef CALLER caller_type;   
      
         caller_type * caller;   
      
   };   
      
   template    
   struct FuncCore : virtual Func_Impl   
   {   
         typedef typename   
         decltype(std::mem_fn(&IMPL::exec_impl))::result_type return_type;   
      
         virtual return_type exec_wrap(ARGS...) = 0;   
      
         virtual ~FuncCore() { }   
      
         return_type exec(   
                 typename IMPL::caller_type * caller,   
                 ARGS... args)   
         {   
             Func_Impl::caller = caller;   
             return exec_wrap(args...);   
         }   
      
   };   
      
   template    
   struct Func : public IMPL,   
                    public FuncCore   
   {   
         typedef typename FuncCore::return_type   
             return_type;   
      
         inline return_type exec_wrap(   
                 ARGS... args)   
         {   
             return this->exec_impl(args...);   
         }   
      
   };   
   #endif /* STACKACCESS_H_ */   
   ================= main.cpp ===========================   
   #include    
      
   #include "StackAccess.h"   
      
   struct ListNode   
   {   
   	int data;   
   	ListNode * next;   
      
   	ListNode(int data)   
   	: data(data),   
   	  next(NULL)   
   	{ }   
   };   
      
   struct BinaryTree   
   {   
   	int data;   
   	BinaryTree * left;   
   	BinaryTree * right;   
      
   	BinaryTree()   
   	: data(),   
   	  left(NULL),   
   	  right(NULL)   
   	{ };   
      
   	BinaryTree(int data)   
   	: data(data),   
   	  left(NULL),   
   	  right(NULL)   
   	{ }   
      
   	void print()   
   	{   
   		bool child(false);   
   		std::cout << data;   
   		if (NULL == left && NULL == right)   
   		{   
   			return;   
   		}   
   		std::cout << "{";   
   		if (NULL != left)   
   		{   
   			left->print();   
   			child = true;   
   		}   
   		if (NULL != right)   
   		{   
   			if (child)   
   			{   
   				std::cout << ",";   
   			}   
   			right->print();   
      
   		}   
   		std::cout << "}";   
   	}   
   };   
      
   BinaryTree* sortedListToBST(   
   		ListNode *& list,   
   		int start,   
   		int end)   
   {   
      if (start > end) return NULL;   
      // same as (start+end)/2, avoids overflow   
      int mid = start + (end - start) / 2;   
      BinaryTree *leftChild = sortedListToBST(list, start, mid-1);   
      BinaryTree *parent = new BinaryTree(list->data);   
      parent->left = leftChild;   
      list = list->next;   
      parent->right = sortedListToBST(list, mid+1, end);   
      return parent;   
   }   
      
   BinaryTree* sortedListToBST(   
   		ListNode *head,   
   		int n)   
   {   
      return sortedListToBST(head, 0, n-1);   
   }   
      
   template    
   struct sortedListToBST_Impl : virtual Func_Impl   
   {   
   	typedef sortedListToBST_Impl type;   
      
   	int start;   
   	int end;   
   	int mid;   
   	BinaryTree *new_node;   
      
   	sortedListToBST_Impl()   
   	: new_node(new BinaryTree())   
   	{ };   
      
   	sortedListToBST_Impl(   
   		int p_start,   
   		int p_end)   
   	: start(p_start),   
   	  end(p_end),   
   	  mid(start + (end - start) / 2),   
   	  new_node((start > end)?NULL:new BinaryTree())   
   	{ };   
      
   	void exec_left(   
   		type * caller,   
   		ListNode *& current_element)   
   	{   
   		if (NULL == new_node) return;   
      
   		type(start, mid-1).exec_left(this, current_element);   
      
   		new_node->data = current_element->data;   
   		current_element = current_element->next;   
      
   		caller->new_node->left = new_node;   
      
   		type(mid+1, end).exec_right(this, current_element);   
   	};   
      
   	void exec_right(   
   		type * caller,   
   		ListNode *& current_element)   
   	{   
   		if (NULL == new_node) return;   
      
   		type(start, mid-1).exec_left(this, current_element);   
      
   		new_node->data = current_element->data;   
   		current_element = current_element->next;   
      
   		caller->new_node->right = new_node;   
      
   		type(mid+1, end).exec_right(this, current_element);   
   	}   
      
   	BinaryTree* exec_impl(   
   		ListNode *& current_element,   
   		int n)   
   	{   
   		start = 0;   
   		end = n-1;   
   		mid = start + (end - start) / 2;   
      
   		type(start, mid-1).exec_left(this, current_element);   
      
   		new_node->data = current_element->data;   
   		current_element = current_element->next;   
      
   		type(mid+1, end).exec_right(this, current_element);   
      
   		return new_node;   
   	}   
   };   
      
   int main(   
   	int,   
   	char**)   
   {   
   	const int no = 30;   
   	ListNode *root = NULL;   
   	ListNode *inserter = NULL;   
      
   	for (int i = 0; i < no; ++i)   
   	{   
   		ListNode *elem = new ListNode(i);   
   		if (NULL == inserter)   
   		{   
   			root = elem;   
   		}   
   		else   
   		{   
   			inserter->next = elem;   
   		}   
   		inserter = elem;   
   	}   
      
   	{   
   		BinaryTree *tree = sortedListToBST(root, no);   
   		tree->print();   
   		std::cout << std::endl;   
   	}   
      
   	{   
   		Nop nop;   
   		BinaryTree * tree = Func, ListNode*,   
   int>().   
   			exec(&nop, root, no);   
   		tree->print();   
   		std::cout << std::endl;   
   	}   
      
   	return 0;   
   }   
      
      
   --   
         [ See http://www.gotw.ca/resources/clcm.htm for info about ]   
         [ comp.lang.c++.moderated.    First time posters: Do this! ]   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]


(c) 1994,  bbs@darkrealms.ca