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]

[Patch] Remove fpos<>::operator== and !=


Hi,

a few days ago, while working on something else, I noticed that this kind of code did compile:

   std::streampos pos;
   ...
   -1 != pos

and this one did not:

   std::streampos pos;
   ...
   pos != -1

The inconsistency is due to operator== and operator!= being member functions, and, I maintain, not really needed, because fpos has got a conversion operator to streamoff (a signed integer type). I propose to simply remove the operators, and just exploit the conversions - I cannot see anything wrong with that - will wait until tomorrow in case of different opinions.

Tested x86-linux.

Paolo.

//////////////////
2006-03-13  Paolo Carlini  <pcarlini@suse.de>

	* include/bits/postypes.h (fpos<>::operator==, operator!=): Remove,
	exploit conversion to streamoff.
	* testsuite/27_io/fpos/mbstate_t/5.cc: New.
Index: include/bits/postypes.h
===================================================================
--- include/bits/postypes.h	(revision 111977)
+++ include/bits/postypes.h	(working copy)
@@ -1,6 +1,6 @@
 // Position types -*- C++ -*-
 
-// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005
+// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
 // Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
@@ -119,6 +119,11 @@
       /// Convert to streamoff.
       operator streamoff() const { return _M_off; }
 
+      // NB: Via conversion to streamoff, two fpos objects can be compared.
+      // The standard only requires that operator== must be an equivalence
+      // relation.  In this implementation two fpos objects belong to the
+      // same equivalence class if the contained offsets compare equal.
+
       /// Remember the value of @a st.
       void
       state(_StateT __st)
@@ -129,20 +134,6 @@
       state() const
       { return _M_state; }
 
-      // The standard only requires that operator== must be an
-      // equivalence relation. In this implementation two fpos<StateT>
-      // objects belong to the same equivalence class if the contained
-      // offsets compare equal.
-      /// Test if equivalent to another position.
-      bool
-      operator==(const fpos& __other) const
-      { return _M_off == __other._M_off; }
-
-      /// Test if not equivalent to another position.
-      bool
-      operator!=(const fpos& __other) const
-      { return _M_off != __other._M_off; }
-
       // The standard requires that this operator must be defined, but
       // gives no semantics. In this implemenation it just adds it's
       // argument to the stored offset and returns *this.
Index: testsuite/27_io/fpos/mbstate_t/5.cc
===================================================================
--- testsuite/27_io/fpos/mbstate_t/5.cc	(revision 0)
+++ testsuite/27_io/fpos/mbstate_t/5.cc	(revision 0)
@@ -0,0 +1,47 @@
+// { dg-do compile }
+
+// 2006-03-13  Paolo Carlini  <pcarlini@suse.de>
+
+// Copyright (C) 2006 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// 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.
+
+// 27.4.3 template class fpos
+
+#include <ios>
+
+void test01()
+{
+  bool test01, test02;
+
+  std::streampos pos01(-1), pos02(0);
+
+  test01 = pos01 == -1;
+  test01 = -1 == pos01;  
+
+  test02 = pos02 != -1;
+  test02 = -1 != pos02;
+}

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