This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: First patch to simplify <algorithm>


Gabriel Dos Reis wrote:

caj <caj@cs.york.ac.uk> writes:

| Woops, missed a file I should have attached. Sorry.
| | // Default predicates for use in algorithm -*- C++ -*-.
| | // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
| // 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
| // terms of the GNU General Public License as published by the
| // Free Software Foundation; either version 2, or (at your option)
| // any later version.
| | // This library is distributed in the hope that it will be useful,
| // but WITHOUT ANY WARRANTY; without even the implied warranty of
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
| // GNU General Public License for more details.
| | // You should have received a copy of the GNU General Public License along
| // with this library; see the file COPYING. If not, write to the Free
| // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
| // USA.
| | // As a special exception, you may use this file as part of a free software
| // library without restriction. Specifically, if other files instantiate
| // templates or use macros or inline functions from this file, or you compile
| // this file and link it with other files to produce an executable, this
| // file does not by itself cause the resulting executable to be covered by
| // the GNU General Public License. This exception does not however
| // invalidate any other reasons why the executable file might be covered by
| // the GNU General Public License.
| | // Written by Chris Jefferson <chris@bubblescope.net>
| | /** @file default_preds.h


I would suggest predefined_ops.h.  The reason this is more about
language built-in operators turned into that function objects than
mere predicates.


| * This is an internal header file, included by other library headers.
| * You should not attempt to use it directly.
| */
| | #ifndef _DEFAULT_PREDS_H
| #define _DEFAULT_PREDS_H 1
| | #pragma GCC system_header
| | namespace std
| {
| template<typename _Tp1, typename _Tp2 = _Tp1>
| struct __default_eq_pred
| {
| bool
| operator()(const _Tp1& __t1, const _Tp2& __t2)
| { return __t1 == __t2; }
| };


I have a slight preference for

 (1) putting the stuff in __gnu_cxx::
 (2) using standard names, e.g. equal, less, greater, ...
     They are already reserved for implementation.
 (3) making the operator a member template, instead of parameterizing
     the whole class; they should be const-members.

E.g.

namespace __gnu_cxx {
struct less {
template<class _Tp1, class _Tp2> bool operator()(const _Tp1& __lrhs, const _Tp2& __rhs) const
{ return __lhs < __rhs; }
}





For some reason I thought I couldn't declare this as a member template. I'm really not sure why now, and it's clearly neater, as now there is no need to pass the type at all. I agree with all these points, other than (possibly) calling them equal, less, greater. I'm a little worried about possible collisions with the "normal" less, equal, greater, although such things should be easily avoidable (as you say).

The only very minor thing I've noticed is that in theory someone could notice/detect this change, as now we will always be calling operator< on const objects whereas before we were calling it on non-const objects. A bunch of overloads could be introduced, but I'm sure people can't assume we are going to be calling non-const operator<, and if anyone is relying on it we can stand on them until they are quiet.

Chris


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]