1affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===- InputTree.h --------------------------------------------------------===// 25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// The MCLinker Project 45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source 65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details. 75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifndef MCLD_INPUT_TREE_H 105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define MCLD_INPUT_TREE_H 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h> 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "mcld/ADT/BinTree.h" 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "mcld/ADT/TypeTraits.h" 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "mcld/MC/MCLDInput.h" 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "mcld/MC/InputFactory.h" 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "mcld/Support/FileSystem.h" 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <string> 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class template<typename Traits, typename Iterator> PolicyIterator<mcld::Input> 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief PolicyIterator<mcld::Input> is a partially specific PolicyIterator 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<typename Traits, typename IteratorType> 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass PolicyIterator<mcld::Input, Traits, IteratorType> : public PolicyIteratorBase<Input, Traits, IteratorType> 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef PolicyIterator<Input, Traits, IteratorType> Self; 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef PolicyIteratorBase<Input, Traits, IteratorType> Base; 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef PolicyIterator<Input, typename Traits::nonconst_traits, IteratorType> iterator; 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef PolicyIterator<Input, typename Traits::const_traits, IteratorType> const_iterator; 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao PolicyIterator() 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao : Base() {} 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao PolicyIterator(const iterator &X) 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao : Base(X.m_pNode) {} 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao explicit PolicyIterator(NodeBase* X) 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao : Base(X) {} 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao virtual ~PolicyIterator() {} 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isGroup() const 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return !Base::hasData(); } 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Self& operator++() { 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao IteratorType::advance(); 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (isGroup()) 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao IteratorType::advance(); 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return *this; 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Self operator++(int) { 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Self tmp(*this); 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao IteratorType::advance(); 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (isGroup()) 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao IteratorType::advance(); 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return tmp; 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class InputTree 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief InputTree is the input tree to contains all inputs from the 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * command line. 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * InputTree, of course, is uncopyable. 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * @see Input 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass InputTree : public BinaryTree<Input> 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef BinaryTree<Input> BinTreeTy; 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao enum Direction { 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Inclusive = TreeIteratorBase::Leftward, 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Positional = TreeIteratorBase::Rightward 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao }; 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef BinaryTree<Input>::iterator iterator; 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef BinaryTree<Input>::const_iterator const_iterator; 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /** \class Mover 94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * \brief Mover provides the interface for moving iterator forward. 95affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * 96affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * Mover is a function object (functor). @ref Mover::move moves 97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * iterator forward in certain direction. @ref Mover::connect 98affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * connects two nodes of the given iterators togather. 99affc150dc44fab1911775a49636d0ce85333b634Zonr Chang */ 100affc150dc44fab1911775a49636d0ce85333b634Zonr Chang struct Mover { 101affc150dc44fab1911775a49636d0ce85333b634Zonr Chang virtual ~Mover() {} 10267e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao virtual void connect(TreeIteratorBase& pFrom, const TreeIteratorBase& pTo) const = 0; 10367e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao virtual void move(TreeIteratorBase& pNode) const = 0; 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao }; 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 106affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /** \class Succeeder 107affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * \brief class Succeeder moves the iterator afterward. 108affc150dc44fab1911775a49636d0ce85333b634Zonr Chang */ 109affc150dc44fab1911775a49636d0ce85333b634Zonr Chang struct Succeeder : public Mover { 11067e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao virtual void connect(TreeIteratorBase& pFrom, const TreeIteratorBase& pTo) const { 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao proxy::hook<Positional>(pFrom.m_pNode, pTo.m_pNode); 1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 11467e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao virtual void move(TreeIteratorBase& pNode) const { 1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pNode.move<Positional>(); 1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao }; 1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 119affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /** \class Includer 120affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * \brief class Includer moves the iterator downward. 121affc150dc44fab1911775a49636d0ce85333b634Zonr Chang */ 122affc150dc44fab1911775a49636d0ce85333b634Zonr Chang struct Includer : public Mover { 12367e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao virtual void connect(TreeIteratorBase& pFrom, const TreeIteratorBase& pTo) const { 1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao proxy::hook<Inclusive>(pFrom.m_pNode, pTo.m_pNode); 1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 12767e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao virtual void move(TreeIteratorBase& pNode) const { 1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pNode.move<Inclusive>(); 1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao }; 1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static Succeeder Afterward; 1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static Includer Downward; 1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao using BinTreeTy::merge; 1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao InputTree(InputFactory& pInputFactory); 1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ~InputTree(); 1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- modify ----- // 1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// insert - create a leaf node and merge it in the tree. 1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // This version of join determines the direction at run time. 146affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // @param pRoot position the parent node 147affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // @param pMover the direction of the connecting edge of the parent node. 1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao template<size_t DIRECT> 14967e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao InputTree& insert(TreeIteratorBase pRoot, 1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const std::string& pNamespec, 1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const sys::fs::Path& pPath, 1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao unsigned int pType = Input::Unknown); 1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao template<size_t DIRECT> 15567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao InputTree& enterGroup(TreeIteratorBase pRoot); 1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao template<size_t DIRECT> 15867e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao InputTree& insert(TreeIteratorBase pRoot, 1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const Input& pInput); 1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 16167e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao InputTree& merge(TreeIteratorBase pRoot, 162affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const Mover& pMover, 1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao InputTree& pTree); 1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 16567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao InputTree& insert(TreeIteratorBase pRoot, 166affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const Mover& pMover, 1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const std::string& pNamespec, 1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const sys::fs::Path& pPath, 1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao unsigned int pType = Input::Unknown); 1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 17167e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao InputTree& insert(TreeIteratorBase pRoot, 172affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const Mover& pMover, 1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const Input& pInput); 1745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 17567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao InputTree& enterGroup(TreeIteratorBase pRoot, 176affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const Mover& pMover); 1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- observers ----- // 1795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao unsigned int numOfInputs() const 1805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_FileFactory.size(); } 1815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool hasInput() const 1835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return !m_FileFactory.empty(); } 1845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 1865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao InputFactory& m_FileFactory; 1875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 1895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool isGroup(const InputTree::iterator& pos); 1915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool isGroup(const InputTree::const_iterator& pos); 1925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool isGroup(const InputTree::dfs_iterator& pos); 1935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool isGroup(const InputTree::const_dfs_iterator& pos); 1945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool isGroup(const InputTree::bfs_iterator& pos); 1955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool isGroup(const InputTree::const_bfs_iterator& pos); 1965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld 1985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 2005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// template member functions 2015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<size_t DIRECT> 2025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaomcld::InputTree& 20367e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liaomcld::InputTree::insert(mcld::TreeIteratorBase pRoot, 2045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const std::string& pNamespec, 2055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const mcld::sys::fs::Path& pPath, 2065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao unsigned int pType) 2075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao BinTreeTy::node_type* node = createNode(); 2095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao node->data = m_FileFactory.produce(pNamespec, pPath, pType); 210affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (pRoot.isRoot()) 211affc150dc44fab1911775a49636d0ce85333b634Zonr Chang proxy::hook<TreeIteratorBase::Leftward>(pRoot.m_pNode, 2125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_cast<const node_type*>(node)); 2135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao else 214affc150dc44fab1911775a49636d0ce85333b634Zonr Chang proxy::hook<DIRECT>(pRoot.m_pNode, 2155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_cast<const node_type*>(node)); 2165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return *this; 2175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<size_t DIRECT> 2205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaomcld::InputTree& 22167e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liaomcld::InputTree::enterGroup(mcld::TreeIteratorBase pRoot) 2225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao BinTreeTy::node_type* node = createNode(); 224affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (pRoot.isRoot()) 225affc150dc44fab1911775a49636d0ce85333b634Zonr Chang proxy::hook<TreeIteratorBase::Leftward>(pRoot.m_pNode, 2265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_cast<const node_type*>(node)); 2275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao else 228affc150dc44fab1911775a49636d0ce85333b634Zonr Chang proxy::hook<DIRECT>(pRoot.m_pNode, 2295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_cast<const node_type*>(node)); 2305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return *this; 2315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<size_t DIRECT> 23467e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liaomcld::InputTree& mcld::InputTree::insert(mcld::TreeIteratorBase pRoot, 2355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const mcld::Input& pInput) 2365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao BinTreeTy::node_type* node = createNode(); 2385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao node->data = const_cast<mcld::Input*>(&pInput); 239affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (pRoot.isRoot()) 240affc150dc44fab1911775a49636d0ce85333b634Zonr Chang proxy::hook<TreeIteratorBase::Leftward>(pRoot.m_pNode, 2415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_cast<const node_type*>(node)); 2425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao else 243affc150dc44fab1911775a49636d0ce85333b634Zonr Chang proxy::hook<DIRECT>(pRoot.m_pNode, 2445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_cast<const node_type*>(node)); 2455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return *this; 2465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 2495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 250