1169691Skan// -*- C++ -*-
2169691Skan
3169691Skan// Copyright (C) 2005, 2006 Free Software Foundation, Inc.
4169691Skan//
5169691Skan// This file is part of the GNU ISO C++ Library.  This library is free
6169691Skan// software; you can redistribute it and/or modify it under the terms
7169691Skan// of the GNU General Public License as published by the Free Software
8169691Skan// Foundation; either version 2, or (at your option) any later
9169691Skan// version.
10169691Skan
11169691Skan// This library is distributed in the hope that it will be useful, but
12169691Skan// WITHOUT ANY WARRANTY; without even the implied warranty of
13169691Skan// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14169691Skan// General Public License for more details.
15169691Skan
16169691Skan// You should have received a copy of the GNU General Public License
17169691Skan// along with this library; see the file COPYING.  If not, write to
18169691Skan// the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
19169691Skan// MA 02111-1307, USA.
20169691Skan
21169691Skan// As a special exception, you may use this file as part of a free
22169691Skan// software library without restriction.  Specifically, if other files
23169691Skan// instantiate templates or use macros or inline functions from this
24169691Skan// file, or you compile this file and link it with other files to
25169691Skan// produce an executable, this file does not by itself cause the
26169691Skan// resulting executable to be covered by the GNU General Public
27169691Skan// License.  This exception does not however invalidate any other
28169691Skan// reasons why the executable file might be covered by the GNU General
29169691Skan// Public License.
30169691Skan
31169691Skan// Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL.
32169691Skan
33169691Skan// Permission to use, copy, modify, sell, and distribute this software
34169691Skan// is hereby granted without fee, provided that the above copyright
35169691Skan// notice appears in all copies, and that both that copyright notice
36169691Skan// and this permission notice appear in supporting documentation. None
37169691Skan// of the above authors, nor IBM Haifa Research Laboratories, make any
38169691Skan// representation about the suitability of this software for any
39169691Skan// purpose. It is provided "as is" without express or implied
40169691Skan// warranty.
41169691Skan
42169691Skan/**
43169691Skan * @file tree_trace_base.hpp
44169691Skan * Contains tree-related policies.
45169691Skan */
46169691Skan
47169691Skan#ifndef PB_DS_TREE_TRACE_BASE_HPP
48169691Skan#define PB_DS_TREE_TRACE_BASE_HPP
49169691Skan
50169691Skan#ifdef PB_DS_TREE_TRACE
51169691Skan
52169691Skan#include <ext/pb_ds/detail/basic_tree_policy/basic_tree_policy_base.hpp>
53169691Skan#include <ext/pb_ds/detail/basic_tree_policy/null_node_metadata.hpp>
54169691Skan
55169691Skannamespace pb_ds
56169691Skan{
57169691Skan
58169691Skan  namespace detail
59169691Skan  {
60169691Skan
61169691Skan#ifdef PB_DS_TREE_TRACE
62169691Skan
63169691Skan#define PB_DS_CLASS_T_DEC						\
64169691Skan    template<								\
65169691Skan						class Const_Node_Iterator, \
66169691Skan						class Node_Iterator,	\
67169691Skan						class Cmp_Fn,		\
68169691Skan						bool Node_Based,	\
69169691Skan						class Allocator>
70169691Skan
71169691Skan#define PB_DS_CLASS_C_DEC						\
72169691Skan    tree_trace_base<							\
73169691Skan						Const_Node_Iterator,	\
74169691Skan						Node_Iterator,		\
75169691Skan						Cmp_Fn,			\
76169691Skan						Node_Based,		\
77169691Skan						Allocator>
78169691Skan
79169691Skan#define PB_DS_BASE_C_DEC						\
80169691Skan    basic_tree_policy_base<				\
81169691Skan								Const_Node_Iterator, \
82169691Skan								Node_Iterator, \
83169691Skan								Allocator>
84169691Skan
85169691Skan    template<typename Const_Node_Iterator,
86169691Skan	     class Node_Iterator,
87169691Skan	     class Cmp_Fn,
88169691Skan	     bool Node_Based,
89169691Skan	     class Allocator>
90169691Skan    class tree_trace_base : private PB_DS_BASE_C_DEC
91169691Skan    {
92169691Skan    public:
93169691Skan      void
94169691Skan      trace() const;
95169691Skan
96169691Skan    private:
97169691Skan      typedef PB_DS_BASE_C_DEC base_type;
98169691Skan
99169691Skan      typedef Const_Node_Iterator const_node_iterator;
100169691Skan
101169691Skan      typedef typename Allocator::size_type size_type;
102169691Skan
103169691Skan    private:
104169691Skan      void
105169691Skan      trace_node(const_node_iterator nd_it, size_type level) const;
106169691Skan
107169691Skan      virtual bool
108169691Skan      empty() const = 0;
109169691Skan
110169691Skan      virtual const_node_iterator
111169691Skan      node_begin() const = 0;
112169691Skan
113169691Skan      virtual const_node_iterator
114169691Skan      node_end() const = 0;
115169691Skan
116169691Skan      static void
117169691Skan      print_node_pointer(Const_Node_Iterator nd_it, integral_constant<int,true>);
118169691Skan
119169691Skan      static void
120169691Skan      print_node_pointer(Const_Node_Iterator nd_it, integral_constant<int,false>);
121169691Skan
122169691Skan      template<typename Metadata_>
123169691Skan      static void
124169691Skan      trace_it_metadata(Const_Node_Iterator nd_it, type_to_type<Metadata_>);
125169691Skan
126169691Skan      static void
127169691Skan      trace_it_metadata(Const_Node_Iterator, type_to_type<null_node_metadata>);
128169691Skan    };
129169691Skan
130169691Skan    PB_DS_CLASS_T_DEC
131169691Skan    void
132169691Skan    PB_DS_CLASS_C_DEC::
133169691Skan    trace() const
134169691Skan    {
135169691Skan      if (empty())
136169691Skan        return;
137169691Skan
138169691Skan      trace_node(node_begin(), 0);
139169691Skan    }
140169691Skan
141169691Skan    PB_DS_CLASS_T_DEC
142169691Skan    void
143169691Skan    PB_DS_CLASS_C_DEC::
144169691Skan    trace_node(const_node_iterator nd_it, size_type level) const
145169691Skan    {
146169691Skan      if (nd_it.get_r_child() != node_end())
147169691Skan        trace_node(nd_it.get_r_child(), level + 1);
148169691Skan
149169691Skan      for (size_type i = 0; i < level; ++i)
150169691Skan        std::cerr << ' ';
151169691Skan
152169691Skan      print_node_pointer(nd_it, integral_constant<int,Node_Based>());
153169691Skan      std::cerr << base_type::extract_key(*(*nd_it));
154169691Skan
155169691Skan      typedef
156169691Skan        type_to_type<
157169691Skan	typename const_node_iterator::metadata_type>
158169691Skan        m_type_ind_t;
159169691Skan
160169691Skan      trace_it_metadata(nd_it, m_type_ind_t());
161169691Skan
162169691Skan      std::cerr << std::endl;
163169691Skan
164169691Skan      if (nd_it.get_l_child() != node_end())
165169691Skan        trace_node(nd_it.get_l_child(), level + 1);
166169691Skan    }
167169691Skan
168169691Skan    PB_DS_CLASS_T_DEC
169169691Skan    template<typename Metadata_>
170169691Skan    void
171169691Skan    PB_DS_CLASS_C_DEC::
172169691Skan    trace_it_metadata(Const_Node_Iterator nd_it, type_to_type<Metadata_>)
173169691Skan    {
174169691Skan      std::cerr << " (" <<
175169691Skan        static_cast<unsigned long>(nd_it.get_metadata()) << ") ";
176169691Skan    }
177169691Skan
178169691Skan    PB_DS_CLASS_T_DEC
179169691Skan    void
180169691Skan    PB_DS_CLASS_C_DEC::
181169691Skan    trace_it_metadata(Const_Node_Iterator, type_to_type<null_node_metadata>)
182169691Skan    { }
183169691Skan
184169691Skan    PB_DS_CLASS_T_DEC
185169691Skan    void
186169691Skan    PB_DS_CLASS_C_DEC::
187169691Skan    print_node_pointer(Const_Node_Iterator nd_it, integral_constant<int,true>)
188169691Skan    {
189169691Skan      std::cerr << nd_it.m_p_nd << " ";
190169691Skan    }
191169691Skan
192169691Skan    PB_DS_CLASS_T_DEC
193169691Skan    void
194169691Skan    PB_DS_CLASS_C_DEC::
195169691Skan    print_node_pointer(Const_Node_Iterator nd_it, integral_constant<int,false>)
196169691Skan    {
197169691Skan      std::cerr <<* nd_it << " ";
198169691Skan    }
199169691Skan
200169691Skan#undef PB_DS_CLASS_T_DEC
201169691Skan
202169691Skan#undef PB_DS_CLASS_C_DEC
203169691Skan
204169691Skan#undef PB_DS_BASE_C_DEC
205169691Skan
206169691Skan#endif // #ifdef    PB_DS_TREE_TRACE
207169691Skan
208169691Skan  } // namespace detail
209169691Skan
210169691Skan} // namespace pb_ds
211169691Skan
212169691Skan#endif // #ifdef PB_DS_TREE_TRACE
213169691Skan
214169691Skan#endif // #ifndef PB_DS_TREE_TRACE_BASE_HPP
215169691Skan
216