Main Page | Class Hierarchy | Class List | Directories | File List | Class Members

collating_choice.h

00001 /***************************************************************************
00002  *   Copyright (C) 2006 by Radko Mihal                                     *
00003  *   rmihal@pobox.sk                                                       *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU General Public License as published by  *
00007  *   the Free Software Foundation; either version 2 of the License, or     *
00008  *   (at your option) any later version.                                   *
00009  *                                                                         *
00010  *   This program is distributed in the hope that it will be useful,       *
00011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00013  *   GNU General Public License for more details.                          *
00014  *                                                                         *
00015  *   You should have received a copy of the GNU General Public License     *
00016  *   along with this program; if not, write to the                         *
00017  *   Free Software Foundation, Inc.,                                       *
00018  *   51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.              *
00019  ***************************************************************************/
00020 #ifndef BRACKET_EXPRESSIONCOLLATING_CHOICE_H
00021 #define BRACKET_EXPRESSIONCOLLATING_CHOICE_H
00022 
00023 namespace bracket_expression {
00024 
00025 template<typename E>
00026 class collating_choice
00027 {
00028 typedef typename grammar_to_parser::basic_parser<E>::parser_list parser_list;
00029 typedef std::ctype_base ctypebase;
00030         
00031         grammar_to_parser::basic_except_terminal<E,meta_char_choice<E> >        
00032                                                                                                                                 m_non_metas;
00033         grammar_to_parser::basic_choice<E,collating_symbol<E> >         m_collating_symbol;
00034         
00035         unsigned long m_size;
00036         
00037 public:
00038     collating_choice() : m_size(0) {};
00039         ~collating_choice() {};
00040         
00041         int matched_size() { return m_size; }
00042         
00043         int compare( const E* buf, const unsigned long buf_length )
00044         {
00045                 int ret = -1;
00046                 m_size = 0;
00047                 if( m_non_metas.is_parsed() )
00048                 {
00049                         unsigned long to_compare_length = 
00050                                                 collating_symbol<E>::get_symbol_len(buf,buf_length);
00051                         
00052                         ret = std::use_facet< std::collate<E> >(std::locale()).compare(
00053                                                                                                                         buf,
00054                                                                                                                         buf+to_compare_length,
00055                                                                                                                         m_non_metas.get(),
00056                                                                                                                         m_non_metas.get()+1 );
00057                         m_size = to_compare_length;
00058                 }
00059                 else
00060                 {
00061                         ret = m_collating_symbol->compare(buf,buf_length); 
00062                         m_size = m_collating_symbol->matched_size();
00063                 }
00064                 return ret;
00065         }
00066         
00067         
00068         void push_parsers( parser_list &l )
00069         {
00070                 l.push_back( &m_collating_symbol );
00071                 l.push_back( &m_non_metas );
00072         }       
00073 
00074 };
00075 
00076 };
00077 
00078 #endif

Generated on Sun Jul 2 18:39:42 2006 for grammar2parser.kdevelop by  doxygen 1.4.1