00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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