Newsgroup: it.comp.lang.c++
Titolo: MALEDETTA Rogue Wave!!! (e BCC 5.5)

Ho implementato un mio streambuf (conbuf) in cui uso due buffer,
uno per la scrittura ed uno per la lettura;
in questo modo le cose sono molto piů semplici.
Al momento del test accadeva una cosa assurda:
iconstream in;
int a;
in >> a;
std::cout << "in.rdbuf->in_avail() << '\n';
char ch;
in.get(ch);
std::cout << "in.rdbuf->in_avail() << '\n';
Ebbene, il primo in_avail() mi restituiva 1 mentre il secondo 74!!
Dopo aver sbattuto la testa per molto tempo (l'implementazione
di conbuf era troppo semplice per essere errata!) ho
avuto l'illuminazione...
Sono andato cosě a controllare cosa cavolo faceva lo streambuf
della Rogue Wave e con ORRORE leggo:
template<class charT, class traits>
streamsize basic_streambuf<charT, traits>::showmanyc()
{
    if(gptr())
        if(pptr() > egptr()) setg(eback(), gptr(), pptr());
    else
        if(pptr()) setg(pbase(), pbase(), pptr());
    return (streamsize)(egptr() - gptr());
}
Ma che roba č???
Come fa a mischiare i puntatori della get e put area??
Lo streambuf deve servire come base per la derivazione, quindi
deve essere il piů generale possibile.
Alla fine ho fatto l'override di showmanyc() per il mio conbuf
facendogli restituire 0 e tutto funziona a meraviglia!
Che cosa ne pensate di questa cosa?
Saluti  Manlio Perillo

 Che cosa ne pensate di questa cosa?
No comment, veramente no comment...
EMG

Che cosa ne pensate di questa cosa?
Premessa: io non sono un profondo conoscitore degli stream
di i/o del C++ (per dirla tutta provo una certa repulsione
con cui sto combattendo). Comunque non credo che sia corretto
fare l'override di solo alcune delle funzioni nella definizione
di una tua classe streambuf.
Se implementi una tua versione di streambuf la cosa giusta
sarebbe definire l'override di tutti i metodi in modo da
garantire il comportamento che ti aspetti.
Se hai trovato un bug nella versione originale di streambuf
della RogueWave allora e' un conto... ma effettuare
l'override di solo alcuni metodi e arrabbiarsi perche' gli
altri non sono stati implementati come si pensa mi sembra
eccessivo.
L'inheritance per recuperare codice e' sconsigliabile anche
nelle classi che progetti tu; figuriamoci usare inheritance
per recuperare codice che non sai cosa fa.
Per quello che riguarda utilizzare i puntatori alla put
area nelle funzioni che riguardano l'input posso concordare
che si tratti di una scelta discutibile; ma non credo
che si sia violata qualche regola. Se ricordo bene effettuare
letture/scritture consecutive senza chiamate intermedie di
posizionamento non e' permesso.
Il metodo showmanyc inoltre e' veramente molto dipendente
dall'implementazione; prima di utilizzarlo bisognerebbe
controllare come e' implementato. La tua implementazione
(ritornare sempre 0) sebbene legale potrebbe rendere la
tua versione di streambuf non utilizzabile al posto della
versione standard della RogueWave.
Ribasico ancora che si tratta solo di una impressione di un
non informato.
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff


Manlio Perillo

La definizione di derived::g serve a qualcosa o si puņ omettere?
La puoi ommettere, giusto perche` non fa altro che il forwarding
al metodo di classe base (e non ci sono altre g())
Paolo