/*============================================================================= Boost.Wave: A Standard compliant C++ preprocessor library Sample: Collect token statistics from the analysed files http://www.boost.org/ Copyright (c) 2001-2010 Hartmut Kaiser. Distributed under 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) =============================================================================*/ #if !defined(COLLECT_TOKEN_STATISTICS_VERSION_HPP) #define COLLECT_TOKEN_STATISTICS_VERSION_HPP #include #include #include #include /////////////////////////////////////////////////////////////////////////////// class collect_token_statistics { enum { count = boost::wave::T_LAST_TOKEN - boost::wave::T_FIRST_TOKEN }; public: collect_token_statistics() { std::fill(&token_count[0], &token_count[count], 0); } // account for the given token type template void operator() (Token const& token) { using boost::wave::token_id; int id = token_id(token) - boost::wave::T_FIRST_TOKEN; BOOST_ASSERT(id < count); ++token_count[id]; } // print out the token statistics in descending order void print() const { using namespace boost::wave; typedef std::multimap ids_type; ids_type ids; for (unsigned int i = 0; i < count; ++i) { ids.insert(ids_type::value_type( token_count[i], token_id(i + T_FIRST_TOKEN))); } ids_type::reverse_iterator rend = ids.rend(); for(ids_type::reverse_iterator rit = ids.rbegin(); rit != rend; ++rit) { std::cout << boost::wave::get_token_name((*rit).second) << ": " << (*rit).first << std::endl; } } private: int token_count[count]; }; #endif // !defined(COLLECT_TOKEN_STATISTICS_VERSION_HPP)