[
https://issues.apache.org/jira/browse/STDCXX-242?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Martin Sebor updated STDCXX-242:
--------------------------------
Severity: Usability
Affects Version/s: 4.2.1
Remaining Estimate: 4h
Original Estimate: 4h
Added 4.2.1 to the list of affected versions and estimated effort.
> std::istream::get(unsigned char&) missing
> -----------------------------------------
>
> Key: STDCXX-242
> URL: https://issues.apache.org/jira/browse/STDCXX-242
> Project: C++ Standard Library
> Issue Type: Improvement
> Components: 27. Input/Output
> Affects Versions: 4.1.2, 4.1.3, 4.1.4, 4.2.0, 4.2.1
> Environment: all
> Reporter: Martin Sebor
> Fix For: 4.3
>
> Original Estimate: 4h
> Remaining Estimate: 4h
>
> Copied from the Rogue Wave bug tracking database:
> Class/File: istream
> Fix Priority: Must Fix
> Long Description:
> *** Sep 13 1999 1:51PM *** hanley ***
> Deferred until further notice, on Martin Sebor's (RW Stdlib Tech Lead) advice.
> *** Apr 22 1999 2:04PM *** abrookes ***
> According to Steve Clamage at Sun we can change the implementations of our
> stream classes from typedefs to explicit specializations. I assume that that
> extends to the streambuf that are used to create them. Doing this would
> allow us to easily implement the addtional signitures requested by Sun. It
> would also allow us to make simpler, faster implementations. The current
> implementations assume the general case where charT may have to be resized
> before insertion and extraction from the streambuf. Since this isn't
> necessary for narrow characters the specialization can be much more efficient
> in space and time.
> I think that it is important to add these specializations. Before doing it,
> however, some thought should be given to the overall scope of the changes so
> that the greatest savings can be realized.
> I would estimate that this will take at least a week of effort to implement
> these changes.
> Specializations of various stream classes are required on types char
> and wchar_t. Section 17.4.3 allows user programs to specialize
> standard templates inside namespace std only on user-defined types,
> not on fundamental types.
> Since no valid user program could detect whether you supplied
> explicit char and wchar_t specializations or allowed them to be
> generated from the template, the "as-if" rule (section 1.9) allows
> the implementation to supply an explicit specialization.
> ---
> Steve Clamage, [EMAIL PROTECTED]
> > Date: Wed, 21 Apr 1999 11:20:04 -0700 (PDT)
> > From: Mukesh Kapoor <[EMAIL PROTECTED]>
> > Subject: RE: get(unsigned char&) not supported in istream [bug 4196970]
> > To: [EMAIL PROTECTED]
> >
> > Do you know which section of the standard allows explicit specializations
> > in the standard library? I looked in 17.4 but couldn't find
> > anything about explicit specializations.
> >
> > Mukesh
> >
> > ------------- Begin Forwarded Message -------------
> >
> > From: Allen Brookes <[EMAIL PROTECTED]>
> > To: "'Mukesh Kapoor'" <[EMAIL PROTECTED]>
> > Subject: RE: get(unsigned char&) not supported in istream [bug 4196970]
> > Date: Wed, 21 Apr 1999 11:01:48 -0700
> >
> > This sounds like a good solution. I have tried to find where in the
> > standard it specifies when explicit specialization can be used but
> > haven't found it. Do you have a reference for this?
> >
> > Allen
> >
> > -----Original Message-----
> > From: Mukesh Kapoor [mailto:[EMAIL PROTECTED]
> > Sent: Wednesday, April 21, 1999 9:53 AM
> > To: [EMAIL PROTECTED]
> > Cc: [EMAIL PROTECTED]
> > Subject: RE: get(unsigned char&) not supported in istream [bug 4196970]
> >
> >
> > > We are having some trouble with this. istream in the standard is a
> > > typedef for basic_istream<char, char_traits<char> >. This means that
> > > any additions that we make to istream will also be in other
> > > instantiations of basic_istream. Having get(unsigned char&) doesn't
> > > make sense for other instantiations. There is a signiture for get
> > with
> > > charT& so that if we added this signiture and charT is unsigned char
> > > then the signitures would be ambiguous.
> >
> > Allen,
> >
> > Here is a response from Steve Clamage:
> >
> > From: Steve Clamage <[EMAIL PROTECTED]>
> >
> > The streams for char and wchar_t could be explicit specializations,
> > not just instantiations of the template. It makes sense to
> > specialize them for efficiency, if not for any other reason.
> >
> > In that case, it would be simple, and a good idea in my view, to add
> > additional functions to the char specialization. The functions
> > get(unsigned char&) and get(signed char&) would be high priority
> > additions, for compatibility with classic iostreams. Other
> > possibilities would be functions with unsigned char* parameters
> > paired with the existing char* versions.
> >
> > Section 17.4.4.4 of the C++ standard allows such additions. The
> > additions do not affect the behavior of any program that follows
> > the standard, but provide pure extensions.
> >
> > Hope this answers your question.
> >
> > Mukesh
> >
> *** Apr 9 1999 4:54PM *** abrookes ***
> Adding this will be kind of tough. We can't add member functions to istream
> since istream is a typedef. Adding this version of get to basic_istream
> would make it available even for wide characters which would make no sense.
> Perhaps we can do this with some sort of specialization.
> *** Mar 23 1999 3:15PM *** abrookes ***
> This is an enhancement request. It is reasonable and can be done without
> violating the standard.
> *** Mar 23 1999 2:55PM *** abrookes ***
> We implement versions of get listed in standard. Need to determine if this
> is really a bug.
> > The member function get(unsigned char&) is not supported in
> > class istream. This works in classic iostreams and several
> > existing programs use this functionality. The following small
> > test case shows the problem:
> >
> > % cat t.c
> > #include <iostream>
> > #include <strstream>
> >
> > main()
> > {
> > using namespace std;
> >
> > char buffer[20] = "abcd";
> > strstreambuf strbuf(buffer, sizeof(buffer));
> > istream istr(&strbuf);
> >
> > #ifdef WORKS
> > char uc;
> > #else
> > unsigned char uc;
> > #endif
> > istr.get(uc);
> > cout << "uc=" << uc << endl;
> > }
> >
> > % CC t.c
> > "t.c", line 17: Error: Could not find a match for std::basic_istream<char,
> > std::char_traits<char>>::get(unsigned char).
> > "t.c", line 18: Warning: The variable uc has not yet been assigned a value.
> > 1 Error(s) and 1 Warning(s) detected.
> >
> > % CC t.c -DWORKS
> > % ./a.out
> > uc=a
> >
> > Please implement get(unsigned char&) also in your sources. Thanks.
> >
> > Mukesh
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.