Patchwork [v3] simplify std::regex NFA

login
register
mail settings
Submitter Jonathan Wakely
Date Feb. 14, 2011, 10:04 a.m.
Message ID <AANLkTim9M0UmT9gBH=gSV3iX_szeuoT7UpQcV4_6yQxM@mail.gmail.com>
Download mbox | patch
Permalink /patch/83054/
State New
Headers show

Comments

Jonathan Wakely - Feb. 14, 2011, 10:04 a.m.
I noticed these redundant uses of std::function and std::bind while
looking into PR 47724.

2011-02-14  Jonathan Wakely  <jwakely.gcc@gmail.com>

        * include/bits/regex_compiler.h: Remove unnecessary bind() calls.
        * include/bits/regex_nfa.h: Remove unnecessary base classes.

tested x86_64-linux and committed to trunk

Patch

Index: include/bits/regex_compiler.h
===================================================================
--- include/bits/regex_compiler.h	(revision 169994)
+++ include/bits/regex_compiler.h	(working copy)
@@ -1,6 +1,6 @@ 
 // class template regex -*- C++ -*-
 
-// Copyright (C) 2010 Free Software Foundation, Inc.
+// Copyright (C) 2010, 2011 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -714,23 +714,18 @@  namespace __regex
     : _M_traits(__traits), _M_scanner(__b, __e, __flags, _M_traits.getloc()),
       _M_state_store(__flags)
     {
-      using std::bind;
-      using std::placeholders::_1;
-      using std::placeholders::_2;
       typedef _StartTagger<_InIter, _TraitsT> _Start;
       typedef _EndTagger<_InIter, _TraitsT> _End;
 
       _StateSeq __r(_M_state_store,
-      		    _M_state_store._M_insert_subexpr_begin(
-                        bind(_Start(0), _1, _2)));
+      		    _M_state_store._M_insert_subexpr_begin(_Start(0)));
       _M_disjunction();
       if (!_M_stack.empty())
 	{
 	  __r._M_append(_M_stack.top());
 	  _M_stack.pop();
 	}
-      __r._M_append(_M_state_store.
-		    _M_insert_subexpr_end(0, bind(_End(0), _1, _2)));
+      __r._M_append(_M_state_store._M_insert_subexpr_end(0, _End(0)));
       __r._M_append(_M_state_store._M_insert_accept());
     }
 
@@ -905,9 +900,6 @@  namespace __regex
     _Compiler<_InIter, _TraitsT>::
     _M_atom()
     {
-      using std::bind;
-      using std::placeholders::_1;
-      using std::placeholders::_2;
       typedef _CharMatcher<_InIter, _TraitsT> _CMatcher;
       typedef _StartTagger<_InIter, _TraitsT> _Start;
       typedef _EndTagger<_InIter, _TraitsT> _End;
@@ -915,26 +907,23 @@  namespace __regex
       if (_M_match_token(_ScannerT::_S_token_anychar))
 	{
 	  _M_stack.push(_StateSeq(_M_state_store,
-				  _M_state_store.
-				  _M_insert_matcher(bind(_AnyMatcher, _1))));
+                                  _M_state_store._M_insert_matcher
+                                  (_AnyMatcher)));
 	  return true;
 	}
       if (_M_match_token(_ScannerT::_S_token_ord_char))
 	{
-	  _M_stack.push(_StateSeq
-			(_M_state_store, _M_state_store. 
-			 _M_insert_matcher
-			 (bind(_CMatcher(_M_cur_value[0], _M_traits), _1))));
+	  _M_stack.push(_StateSeq(_M_state_store,
+                                  _M_state_store._M_insert_matcher
+                                  (_CMatcher(_M_cur_value[0], _M_traits))));
 	  return true;
 	}
       if (_M_match_token(_ScannerT::_S_token_quoted_char))
 	{
 	  // note that in the ECMA grammar, this case covers backrefs.
 	  _M_stack.push(_StateSeq(_M_state_store,
-				  _M_state_store.
-				  _M_insert_matcher
-				  (bind(_CMatcher(_M_cur_value[0], _M_traits),
-					_1))));
+				  _M_state_store._M_insert_matcher
+				  (_CMatcher(_M_cur_value[0], _M_traits))));
 	  return true;
 	}
       if (_M_match_token(_ScannerT::_S_token_backref))
@@ -947,7 +936,7 @@  namespace __regex
 	  int __mark = _M_state_store._M_sub_count();
 	  _StateSeq __r(_M_state_store,
 			_M_state_store.
-			_M_insert_subexpr_begin(bind(_Start(__mark), _1, _2)));
+			_M_insert_subexpr_begin(_Start(__mark)));
 	  this->_M_disjunction();
 	  if (!_M_match_token(_ScannerT::_S_token_subexpr_end))
 	    __throw_regex_error(regex_constants::error_paren);
@@ -957,7 +946,7 @@  namespace __regex
 	      _M_stack.pop();
 	    }
 	  __r._M_append(_M_state_store._M_insert_subexpr_end
-			(__mark, bind(_End(__mark), _1, _2)));
+			(__mark, _End(__mark)));
 	  _M_stack.push(__r);
 	  return true;
 	}
@@ -969,8 +958,6 @@  namespace __regex
     _Compiler<_InIter, _TraitsT>::
     _M_bracket_expression()
     {
-      using std::bind;
-      using std::placeholders::_1;
       if (_M_match_token(_ScannerT::_S_token_bracket_begin))
 	{
 	  _RMatcherT __matcher(_M_match_token(_ScannerT::_S_token_line_begin),
@@ -979,8 +966,7 @@  namespace __regex
 	      || !_M_match_token(_ScannerT::_S_token_bracket_end))
 	    __throw_regex_error(regex_constants::error_brack);
 	  _M_stack.push(_StateSeq(_M_state_store,
-				  _M_state_store._M_insert_matcher
-				  (bind(__matcher, _1))));
+				  _M_state_store._M_insert_matcher(__matcher)));
 	  return true;
 	}
       return false;
Index: include/bits/regex_nfa.h
===================================================================
--- include/bits/regex_nfa.h	(revision 169994)
+++ include/bits/regex_nfa.h	(working copy)
@@ -1,6 +1,6 @@ 
 // class template regex -*- C++ -*-
 
-// Copyright (C) 2010 Free Software Foundation, Inc.
+// Copyright (C) 2010, 2011 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -82,7 +82,6 @@  namespace __regex
 
   template<typename _FwdIterT, typename _TraitsT>
     struct _StartTagger
-    : public _Tagger
     {
       explicit
       _StartTagger(int __i)
@@ -98,7 +97,6 @@  namespace __regex
 
   template<typename _FwdIterT, typename _TraitsT>
     struct _EndTagger
-    : public _Tagger
     {
       explicit
       _EndTagger(int __i)
@@ -123,7 +121,6 @@  namespace __regex
   // Matches a single character
   template<typename _InIterT, typename _TraitsT>
     struct _CharMatcher
-    : public _Matcher
     {
       typedef typename _TraitsT::char_type char_type;
 
@@ -147,7 +144,6 @@  namespace __regex
   // Matches a character range (bracket expression)
   template<typename _InIterT, typename _TraitsT>
     struct _RangeMatcher
-    : public _Matcher
     {
       typedef typename _TraitsT::char_type _CharT;
       typedef std::basic_string<_CharT>    _StringT;
@@ -208,7 +204,7 @@  namespace __regex
     typedef int  _OpcodeT;
 
     _OpcodeT     _M_opcode;    // type of outgoing transition
-    _StateIdT    _M_next;      // outgoing tranition
+    _StateIdT    _M_next;      // outgoing transition
     _StateIdT    _M_alt;       // for _S_opcode_alternative
     unsigned int _M_subexpr;   // for _S_opcode_subexpr_*
     _Tagger      _M_tagger;    // for _S_opcode_subexpr_*