/*=============================================================================
    Copyright (c) 2002 2004 2006 Joel de Guzman
    http://spirit.sourceforge.net/

    Use, modification and distribution is subject to the Boost Software
    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
    http://www.boost.org/LICENSE_1_0.txt)
=============================================================================*/
#include "./template_stack.hpp"

#ifdef BOOST_MSVC
#pragma warning(disable : 4355)
#endif

namespace quickbook
{
    template_stack::template_stack()
        : scope(template_stack::parser(*this))
        , scopes()
    {
        scopes.push_front(template_symbols());
    }
    
    template_symbol* template_stack::find(std::string const& symbol) const
    {
        for (deque::const_iterator i = scopes.begin(); i != scopes.end(); ++i)
        {
            if (template_symbol* ts = boost::spirit::classic::find(*i, symbol.c_str()))
                return ts;
        }
        return 0;
    }

    template_symbol* template_stack::find_top_scope(std::string const& symbol) const
    {
        return boost::spirit::classic::find(scopes.front(), symbol.c_str());
    }

    template_symbols const& template_stack::top() const
    {
        BOOST_ASSERT(!scopes.empty());
        return scopes.front();
    }
    
    void template_stack::add(std::string const& symbol, template_symbol const& ts)
    {
        BOOST_ASSERT(!scopes.empty());
        boost::spirit::classic::add(scopes.front(), symbol.c_str(), ts);
    }
    
    void template_stack::push()
    {
        scopes.push_front(template_symbols());
    }

    void template_stack::pop()
    {
        scopes.pop_front();
    }
}


