class OSockStream : public SockBuf, public std::ostream {...}
class ISockStream : public SockBuf, public std::istream {...}
Le tout, ca va être d'écrire la classe SockBuf... c'est là où j'aurais
probablement besoin d'aide.
Pour mes classes de fichier, je n'ai pas besoin de streambuf, car en fait,
ces classes s'occupent déja des opérations de lecture/écriture sur le
média. Ce sont des classes héritée d'un passé C, j'ai juste encapsulée les
fonctions dans des classes (elles utilisent fread/fwrite pour lire/écrire
sur le fichier).
Je le pourrais à usage personnel, mais déja plus difficilement
professionnellement (j'ai déja du mal à faire mettre à jour mon
compilateur...).
Mais j'ai bien l'impression que tout ce que je cherche se
trouve dans la STL, suffit juste que j'apprenne à les utiliser...
class OSockStream : public SockBuf, public std::ostream {...}
class ISockStream : public SockBuf, public std::istream {...}
Le tout, ca va être d'écrire la classe SockBuf... c'est là où j'aurais
probablement besoin d'aide.
Pour mes classes de fichier, je n'ai pas besoin de streambuf, car en fait,
ces classes s'occupent déja des opérations de lecture/écriture sur le
média. Ce sont des classes héritée d'un passé C, j'ai juste encapsulée les
fonctions dans des classes (elles utilisent fread/fwrite pour lire/écrire
sur le fichier).
Je le pourrais à usage personnel, mais déja plus difficilement
professionnellement (j'ai déja du mal à faire mettre à jour mon
compilateur...).
Mais j'ai bien l'impression que tout ce que je cherche se
trouve dans la STL, suffit juste que j'apprenne à les utiliser...
class OSockStream : public SockBuf, public std::ostream {...}
class ISockStream : public SockBuf, public std::istream {...}
Le tout, ca va être d'écrire la classe SockBuf... c'est là où j'aurais
probablement besoin d'aide.
Pour mes classes de fichier, je n'ai pas besoin de streambuf, car en fait,
ces classes s'occupent déja des opérations de lecture/écriture sur le
média. Ce sont des classes héritée d'un passé C, j'ai juste encapsulée les
fonctions dans des classes (elles utilisent fread/fwrite pour lire/écrire
sur le fichier).
Je le pourrais à usage personnel, mais déja plus difficilement
professionnellement (j'ai déja du mal à faire mettre à jour mon
compilateur...).
Mais j'ai bien l'impression que tout ce que je cherche se
trouve dans la STL, suffit juste que j'apprenne à les utiliser...
le Monday 23 August 2004 09:14, écrivit :class OSockStream : public SockBuf, public std::ostream {...}
class ISockStream : public SockBuf, public std::istream {...}
oui.
Sauf qu'en sachant que ces stream dérivent de Sockbuf (pluôt que d'en
avoir
un comme membre) seulement de manière à ce que le SockBuf soit construit
avant le stream, on peut faire un héritage privé pour être clair.
pour rendre ça completement explicite, on peut définir un petit template
"base_for_member" et alors
class MonStream : private base_for_member<MonBuf>, public std::ostream ,
il n'y a pas besoin de bien connaitre les stream pour comprendre.
Il faut juste comprendre que la base streambuf a besoin d'accéder au
buffer
(et va s'y déplacer tout seul jusqu'à ne plus pouvoir), et que donc c'est
dans streambuf que sont stockés les pointeurs de (début, courant, fin) de
buffer.
La classe dérivée y accède par les fctions héritées :
(pbase, pptr, epptr) en sortie
et (eback, gptr, egptr) en entrée)
et les mets à jour par setg / setp & pbump.
Inclure des headers boost n'a pas bcp de conséquences par rapport à
changer
de compilateur : ça n'affecte pas ceux qui ne veulent pas utiliser boost..
Je me demande dans quelle proportion d'entreprises utiliser boost est
impossible.
le Monday 23 August 2004 09:14, fgourul.nospam@desysif.fr écrivit :
class OSockStream : public SockBuf, public std::ostream {...}
class ISockStream : public SockBuf, public std::istream {...}
oui.
Sauf qu'en sachant que ces stream dérivent de Sockbuf (pluôt que d'en
avoir
un comme membre) seulement de manière à ce que le SockBuf soit construit
avant le stream, on peut faire un héritage privé pour être clair.
pour rendre ça completement explicite, on peut définir un petit template
"base_for_member" et alors
class MonStream : private base_for_member<MonBuf>, public std::ostream ,
il n'y a pas besoin de bien connaitre les stream pour comprendre.
Il faut juste comprendre que la base streambuf a besoin d'accéder au
buffer
(et va s'y déplacer tout seul jusqu'à ne plus pouvoir), et que donc c'est
dans streambuf que sont stockés les pointeurs de (début, courant, fin) de
buffer.
La classe dérivée y accède par les fctions héritées :
(pbase, pptr, epptr) en sortie
et (eback, gptr, egptr) en entrée)
et les mets à jour par setg / setp & pbump.
Inclure des headers boost n'a pas bcp de conséquences par rapport à
changer
de compilateur : ça n'affecte pas ceux qui ne veulent pas utiliser boost..
Je me demande dans quelle proportion d'entreprises utiliser boost est
impossible.
le Monday 23 August 2004 09:14, écrivit :class OSockStream : public SockBuf, public std::ostream {...}
class ISockStream : public SockBuf, public std::istream {...}
oui.
Sauf qu'en sachant que ces stream dérivent de Sockbuf (pluôt que d'en
avoir
un comme membre) seulement de manière à ce que le SockBuf soit construit
avant le stream, on peut faire un héritage privé pour être clair.
pour rendre ça completement explicite, on peut définir un petit template
"base_for_member" et alors
class MonStream : private base_for_member<MonBuf>, public std::ostream ,
il n'y a pas besoin de bien connaitre les stream pour comprendre.
Il faut juste comprendre que la base streambuf a besoin d'accéder au
buffer
(et va s'y déplacer tout seul jusqu'à ne plus pouvoir), et que donc c'est
dans streambuf que sont stockés les pointeurs de (début, courant, fin) de
buffer.
La classe dérivée y accède par les fctions héritées :
(pbase, pptr, epptr) en sortie
et (eback, gptr, egptr) en entrée)
et les mets à jour par setg / setp & pbump.
Inclure des headers boost n'a pas bcp de conséquences par rapport à
changer
de compilateur : ça n'affecte pas ceux qui ne veulent pas utiliser boost..
Je me demande dans quelle proportion d'entreprises utiliser boost est
impossible.
J'ai très sommairement étudiées ces fonctions et je devrais y arriver avec
ce qu'elles proposent. La seule chose dont je ne suis pas sûr c'est pour
le buffer. Je dois le mettre dans la classe SockBuf et utiliser
streambuf::setbuf avec l'adresse de mon buffer et sa taille, c'est bien ca
?
Inclure des headers boost n'a pas bcp de conséquences par rapport à
changerde compilateur : ça n'affecte pas ceux qui ne veulent pas utiliser
boost.. Je me demande dans quelle proportion d'entreprises utiliser boost
est impossible.
Il n'y aura surement aucun problème si je le demandais (juste le temps que
ca prendra avant de l'avoir). Mais alors, il me faudra expliquer pourquoi,
or jusqu'a présent je n'en ai pas eu besoin.
Les développements c++ sont
très récents dans l'entreprise et ne sont même pas encore utilisés en
production...
J'ai très sommairement étudiées ces fonctions et je devrais y arriver avec
ce qu'elles proposent. La seule chose dont je ne suis pas sûr c'est pour
le buffer. Je dois le mettre dans la classe SockBuf et utiliser
streambuf::setbuf avec l'adresse de mon buffer et sa taille, c'est bien ca
?
Inclure des headers boost n'a pas bcp de conséquences par rapport à
changer
de compilateur : ça n'affecte pas ceux qui ne veulent pas utiliser
boost.. Je me demande dans quelle proportion d'entreprises utiliser boost
est impossible.
Il n'y aura surement aucun problème si je le demandais (juste le temps que
ca prendra avant de l'avoir). Mais alors, il me faudra expliquer pourquoi,
or jusqu'a présent je n'en ai pas eu besoin.
Les développements c++ sont
très récents dans l'entreprise et ne sont même pas encore utilisés en
production...
J'ai très sommairement étudiées ces fonctions et je devrais y arriver avec
ce qu'elles proposent. La seule chose dont je ne suis pas sûr c'est pour
le buffer. Je dois le mettre dans la classe SockBuf et utiliser
streambuf::setbuf avec l'adresse de mon buffer et sa taille, c'est bien ca
?
Inclure des headers boost n'a pas bcp de conséquences par rapport à
changerde compilateur : ça n'affecte pas ceux qui ne veulent pas utiliser
boost.. Je me demande dans quelle proportion d'entreprises utiliser boost
est impossible.
Il n'y aura surement aucun problème si je le demandais (juste le temps que
ca prendra avant de l'avoir). Mais alors, il me faudra expliquer pourquoi,
or jusqu'a présent je n'en ai pas eu besoin.
Les développements c++ sont
très récents dans l'entreprise et ne sont même pas encore utilisés en
production...
tu n'as pas besoin de smart pointers ? c'est tellement utile en C++, et
boost::smart_ptr est particulierment bien faite. et très très polyvalente.
à elle seule elle vaut largement le coup d'utiliser boost. (d'autant qu'il
ya juste besoin des headers, comme pour 90% de boost)
boost::static_assert, aussi, est une lib d'utilité quasiment universelle.
ensuite, la serialization sans effort est à priori aussi qque chose de
presque universellement utile (mais c'est en CVS. la branche 1.32 est sur
le point d'être créée, en gros d'ici 1 mois ou 2 sortira la release)
Les autres librairies de boost sont d'usage plus ou moins spécifique (mais
gagnent à être connues, quand le besoin se présente ça épargne de commencer
à réinventer la roue).
regex, random (la solution basique d'utiliser le rand de base est souvent
trop imprécise), ...
tu n'as pas besoin de smart pointers ? c'est tellement utile en C++, et
boost::smart_ptr est particulierment bien faite. et très très polyvalente.
à elle seule elle vaut largement le coup d'utiliser boost. (d'autant qu'il
ya juste besoin des headers, comme pour 90% de boost)
boost::static_assert, aussi, est une lib d'utilité quasiment universelle.
ensuite, la serialization sans effort est à priori aussi qque chose de
presque universellement utile (mais c'est en CVS. la branche 1.32 est sur
le point d'être créée, en gros d'ici 1 mois ou 2 sortira la release)
Les autres librairies de boost sont d'usage plus ou moins spécifique (mais
gagnent à être connues, quand le besoin se présente ça épargne de commencer
à réinventer la roue).
regex, random (la solution basique d'utiliser le rand de base est souvent
trop imprécise), ...
tu n'as pas besoin de smart pointers ? c'est tellement utile en C++, et
boost::smart_ptr est particulierment bien faite. et très très polyvalente.
à elle seule elle vaut largement le coup d'utiliser boost. (d'autant qu'il
ya juste besoin des headers, comme pour 90% de boost)
boost::static_assert, aussi, est une lib d'utilité quasiment universelle.
ensuite, la serialization sans effort est à priori aussi qque chose de
presque universellement utile (mais c'est en CVS. la branche 1.32 est sur
le point d'être créée, en gros d'ici 1 mois ou 2 sortira la release)
Les autres librairies de boost sont d'usage plus ou moins spécifique (mais
gagnent à être connues, quand le besoin se présente ça épargne de commencer
à réinventer la roue).
regex, random (la solution basique d'utiliser le rand de base est souvent
trop imprécise), ...
le Monday 23 August 2004 12:48, écrivit :J'ai très sommairement étudiées ces fonctions et je devrais y arriver
avec
ce qu'elles proposent. La seule chose dont je ne suis pas sûr c'est pour
le buffer. Je dois le mettre dans la classe SockBuf et utiliser
streambuf::setbuf avec l'adresse de mon buffer et sa taille, c'est bien
ca
?
presque, sauf que streambuf::setbuf ne fait rien du tout :)
(à toi de le redéfinir dans ta classe dérivée si tu veux)
Dans SockBuf, tu alloues de la mémoire, et tu files les pointeurs de début
/
fin à setp (ou setg).
Les fonctions que j'ai évoquées dans le msg d'avant sont les charnières
entre la base et la classe dérivée pour les streambuf, les autres sont
plus
des "options".
tu n'as pas besoin de smart pointers ? c'est tellement utile en C++, et
boost::smart_ptr est particulierment bien faite. et très très polyvalente.
à elle seule elle vaut largement le coup d'utiliser boost. (d'autant qu'il
ya juste besoin des headers, comme pour 90% de boost)
boost::static_assert, aussi, est une lib d'utilité quasiment universelle.
ensuite, la serialization sans effort est à priori aussi qque chose de
presque universellement utile (mais c'est en CVS. la branche 1.32 est sur
le point d'être créée, en gros d'ici 1 mois ou 2 sortira la release)
Les autres librairies de boost sont d'usage plus ou moins spécifique (mais
gagnent à être connues, quand le besoin se présente ça épargne de
commencer
à réinventer la roue).
regex, random (la solution basique d'utiliser le rand de base est souvent
trop imprécise), ...
le Monday 23 August 2004 12:48, fgourul.nospam@desysif.fr écrivit :
J'ai très sommairement étudiées ces fonctions et je devrais y arriver
avec
ce qu'elles proposent. La seule chose dont je ne suis pas sûr c'est pour
le buffer. Je dois le mettre dans la classe SockBuf et utiliser
streambuf::setbuf avec l'adresse de mon buffer et sa taille, c'est bien
ca
?
presque, sauf que streambuf::setbuf ne fait rien du tout :)
(à toi de le redéfinir dans ta classe dérivée si tu veux)
Dans SockBuf, tu alloues de la mémoire, et tu files les pointeurs de début
/
fin à setp (ou setg).
Les fonctions que j'ai évoquées dans le msg d'avant sont les charnières
entre la base et la classe dérivée pour les streambuf, les autres sont
plus
des "options".
tu n'as pas besoin de smart pointers ? c'est tellement utile en C++, et
boost::smart_ptr est particulierment bien faite. et très très polyvalente.
à elle seule elle vaut largement le coup d'utiliser boost. (d'autant qu'il
ya juste besoin des headers, comme pour 90% de boost)
boost::static_assert, aussi, est une lib d'utilité quasiment universelle.
ensuite, la serialization sans effort est à priori aussi qque chose de
presque universellement utile (mais c'est en CVS. la branche 1.32 est sur
le point d'être créée, en gros d'ici 1 mois ou 2 sortira la release)
Les autres librairies de boost sont d'usage plus ou moins spécifique (mais
gagnent à être connues, quand le besoin se présente ça épargne de
commencer
à réinventer la roue).
regex, random (la solution basique d'utiliser le rand de base est souvent
trop imprécise), ...
le Monday 23 August 2004 12:48, écrivit :J'ai très sommairement étudiées ces fonctions et je devrais y arriver
avec
ce qu'elles proposent. La seule chose dont je ne suis pas sûr c'est pour
le buffer. Je dois le mettre dans la classe SockBuf et utiliser
streambuf::setbuf avec l'adresse de mon buffer et sa taille, c'est bien
ca
?
presque, sauf que streambuf::setbuf ne fait rien du tout :)
(à toi de le redéfinir dans ta classe dérivée si tu veux)
Dans SockBuf, tu alloues de la mémoire, et tu files les pointeurs de début
/
fin à setp (ou setg).
Les fonctions que j'ai évoquées dans le msg d'avant sont les charnières
entre la base et la classe dérivée pour les streambuf, les autres sont
plus
des "options".
tu n'as pas besoin de smart pointers ? c'est tellement utile en C++, et
boost::smart_ptr est particulierment bien faite. et très très polyvalente.
à elle seule elle vaut largement le coup d'utiliser boost. (d'autant qu'il
ya juste besoin des headers, comme pour 90% de boost)
boost::static_assert, aussi, est une lib d'utilité quasiment universelle.
ensuite, la serialization sans effort est à priori aussi qque chose de
presque universellement utile (mais c'est en CVS. la branche 1.32 est sur
le point d'être créée, en gros d'ici 1 mois ou 2 sortira la release)
Les autres librairies de boost sont d'usage plus ou moins spécifique (mais
gagnent à être connues, quand le besoin se présente ça épargne de
commencer
à réinventer la roue).
regex, random (la solution basique d'utiliser le rand de base est souvent
trop imprécise), ...
"Samuel Krempp" a écrit dans
le message de news: 4129c665$0$7009$
Inclure des headers boost n'a pas bcp de conséquences par rapport à
changer de compilateur : ça n'affecte pas ceux qui ne veulent pas
utiliser boost.. Je me demande dans quelle proportion d'entreprises
utiliser boost est impossible.
Il n'y aura surement aucun problème si je le demandais (juste le temps
que ca prendra avant de l'avoir). Mais alors, il me faudra expliquer
pourquoi, or jusqu'a présent je n'en ai pas eu besoin. Les
développements c++ sont très récents dans l'entreprise et ne sont même
pas encore utilisés en production...
"Samuel Krempp" <krempp@crans.truc.en.trop.ens-cachan.fr> a écrit dans
le message de news: 4129c665$0$7009$626a14ce@news.free.fr...
Inclure des headers boost n'a pas bcp de conséquences par rapport à
changer de compilateur : ça n'affecte pas ceux qui ne veulent pas
utiliser boost.. Je me demande dans quelle proportion d'entreprises
utiliser boost est impossible.
Il n'y aura surement aucun problème si je le demandais (juste le temps
que ca prendra avant de l'avoir). Mais alors, il me faudra expliquer
pourquoi, or jusqu'a présent je n'en ai pas eu besoin. Les
développements c++ sont très récents dans l'entreprise et ne sont même
pas encore utilisés en production...
"Samuel Krempp" a écrit dans
le message de news: 4129c665$0$7009$
Inclure des headers boost n'a pas bcp de conséquences par rapport à
changer de compilateur : ça n'affecte pas ceux qui ne veulent pas
utiliser boost.. Je me demande dans quelle proportion d'entreprises
utiliser boost est impossible.
Il n'y aura surement aucun problème si je le demandais (juste le temps
que ca prendra avant de l'avoir). Mais alors, il me faudra expliquer
pourquoi, or jusqu'a présent je n'en ai pas eu besoin. Les
développements c++ sont très récents dans l'entreprise et ne sont même
pas encore utilisés en production...
A partir des informations collectées, j'ai fait une petite version de
test de ma future classe SockStreamBuf. Pour l'instant, ca écrit et ca
lit dans un fichier...
class TestBuffer : public std::streambuf
{
protected:
static const int BUFFER_SIZE = 8;
char m_buffer[BUFFER_SIZE];
FILE* m_file;
TestBuffer(FILE* file);
private:
streambuf* setbuf(char_type* s, streamsize n);
int_type underflow();
int_type overflow(int_type c);
int sync();
};
TestBuffer::TestBuffer(FILE* file) :m_file(file)
{
setbuf(m_buffer, BUFFER_SIZE);
}
streambuf* TestBuffer::setbuf(char_type* s, streamsize n)
{
streambuf::setp(s, s + n);
streambuf::setg(s, s + n, s + n);
return this;
}
streambuf::int_type TestBuffer::underflow()
{
size_t n = ::fread(m_buffer, 1, BUFFER_SIZE, m_file);
if (n == -1) return traits_type::eof();
if (n == 0 && ::feof(m_file)) return traits_type::eof();
streambuf::setg(eback(), eback(), eback() + n);
return traits_type::not_eof(*eback());
}
streambuf::int_type TestBuffer::overflow(streambuf::int_type c)
{
size_t n = ::fwrite(m_buffer, 1, BUFFER_SIZE, m_file);
if (n != BUFFER_SIZE) return traits_type::eof();
m_buffer[0] = c;
streambuf::setp(pbase(), epptr());
streambuf::pbump(1);
return traits_type::not_eof(c);
}
int TestBuffer::sync()
{
if (pptr() == pbase()) return 0;
streamsize len = pptr() - pbase();
size_t n = ::fwrite(m_buffer, 1, len, m_file);
if (n != len) return -1;
streambuf::setp(pbase(), epptr());
return 0;
}
class OTestStream : TestBuffer, public std::ostream
{
public:
OTestStream(FILE* file)
:TestBuffer(file), std::ostream(this) {}
};
class ITestStream : TestBuffer, public std::istream
{
public:
ITestStream(FILE* file)
:TestBuffer(file), std::istream(this) {}
};
Même si ce n'est qu'une version de test, toutes les critiques sont les
bienvenues :)
Il y a un certain nombre d'opérations qui n'ont pas de sens pour les
sockets (je pense en particulier aux fonctions seek), je ne les ai
donc pas implémentées... Est-ce suffisant ou faut-il que j'en
fournisse un implémentation qui renverait une erreur (exception ?)
Je me suis appercu que le déclenchement de sync() se faisait avec
std::endl, mais pas avec std::ends. Pour quelle raison ?
Le dernier, je m'y attendais... sur le ITestStream l'operateur >>
considère l'espace comme séparateur au lieu du caractère LF.
Y'a-t-il un moyen de changer ce comportement ?
A partir des informations collectées, j'ai fait une petite version de
test de ma future classe SockStreamBuf. Pour l'instant, ca écrit et ca
lit dans un fichier...
class TestBuffer : public std::streambuf
{
protected:
static const int BUFFER_SIZE = 8;
char m_buffer[BUFFER_SIZE];
FILE* m_file;
TestBuffer(FILE* file);
private:
streambuf* setbuf(char_type* s, streamsize n);
int_type underflow();
int_type overflow(int_type c);
int sync();
};
TestBuffer::TestBuffer(FILE* file) :m_file(file)
{
setbuf(m_buffer, BUFFER_SIZE);
}
streambuf* TestBuffer::setbuf(char_type* s, streamsize n)
{
streambuf::setp(s, s + n);
streambuf::setg(s, s + n, s + n);
return this;
}
streambuf::int_type TestBuffer::underflow()
{
size_t n = ::fread(m_buffer, 1, BUFFER_SIZE, m_file);
if (n == -1) return traits_type::eof();
if (n == 0 && ::feof(m_file)) return traits_type::eof();
streambuf::setg(eback(), eback(), eback() + n);
return traits_type::not_eof(*eback());
}
streambuf::int_type TestBuffer::overflow(streambuf::int_type c)
{
size_t n = ::fwrite(m_buffer, 1, BUFFER_SIZE, m_file);
if (n != BUFFER_SIZE) return traits_type::eof();
m_buffer[0] = c;
streambuf::setp(pbase(), epptr());
streambuf::pbump(1);
return traits_type::not_eof(c);
}
int TestBuffer::sync()
{
if (pptr() == pbase()) return 0;
streamsize len = pptr() - pbase();
size_t n = ::fwrite(m_buffer, 1, len, m_file);
if (n != len) return -1;
streambuf::setp(pbase(), epptr());
return 0;
}
class OTestStream : TestBuffer, public std::ostream
{
public:
OTestStream(FILE* file)
:TestBuffer(file), std::ostream(this) {}
};
class ITestStream : TestBuffer, public std::istream
{
public:
ITestStream(FILE* file)
:TestBuffer(file), std::istream(this) {}
};
Même si ce n'est qu'une version de test, toutes les critiques sont les
bienvenues :)
Il y a un certain nombre d'opérations qui n'ont pas de sens pour les
sockets (je pense en particulier aux fonctions seek), je ne les ai
donc pas implémentées... Est-ce suffisant ou faut-il que j'en
fournisse un implémentation qui renverait une erreur (exception ?)
Je me suis appercu que le déclenchement de sync() se faisait avec
std::endl, mais pas avec std::ends. Pour quelle raison ?
Le dernier, je m'y attendais... sur le ITestStream l'operateur >>
considère l'espace comme séparateur au lieu du caractère LF.
Y'a-t-il un moyen de changer ce comportement ?
A partir des informations collectées, j'ai fait une petite version de
test de ma future classe SockStreamBuf. Pour l'instant, ca écrit et ca
lit dans un fichier...
class TestBuffer : public std::streambuf
{
protected:
static const int BUFFER_SIZE = 8;
char m_buffer[BUFFER_SIZE];
FILE* m_file;
TestBuffer(FILE* file);
private:
streambuf* setbuf(char_type* s, streamsize n);
int_type underflow();
int_type overflow(int_type c);
int sync();
};
TestBuffer::TestBuffer(FILE* file) :m_file(file)
{
setbuf(m_buffer, BUFFER_SIZE);
}
streambuf* TestBuffer::setbuf(char_type* s, streamsize n)
{
streambuf::setp(s, s + n);
streambuf::setg(s, s + n, s + n);
return this;
}
streambuf::int_type TestBuffer::underflow()
{
size_t n = ::fread(m_buffer, 1, BUFFER_SIZE, m_file);
if (n == -1) return traits_type::eof();
if (n == 0 && ::feof(m_file)) return traits_type::eof();
streambuf::setg(eback(), eback(), eback() + n);
return traits_type::not_eof(*eback());
}
streambuf::int_type TestBuffer::overflow(streambuf::int_type c)
{
size_t n = ::fwrite(m_buffer, 1, BUFFER_SIZE, m_file);
if (n != BUFFER_SIZE) return traits_type::eof();
m_buffer[0] = c;
streambuf::setp(pbase(), epptr());
streambuf::pbump(1);
return traits_type::not_eof(c);
}
int TestBuffer::sync()
{
if (pptr() == pbase()) return 0;
streamsize len = pptr() - pbase();
size_t n = ::fwrite(m_buffer, 1, len, m_file);
if (n != len) return -1;
streambuf::setp(pbase(), epptr());
return 0;
}
class OTestStream : TestBuffer, public std::ostream
{
public:
OTestStream(FILE* file)
:TestBuffer(file), std::ostream(this) {}
};
class ITestStream : TestBuffer, public std::istream
{
public:
ITestStream(FILE* file)
:TestBuffer(file), std::istream(this) {}
};
Même si ce n'est qu'une version de test, toutes les critiques sont les
bienvenues :)
Il y a un certain nombre d'opérations qui n'ont pas de sens pour les
sockets (je pense en particulier aux fonctions seek), je ne les ai
donc pas implémentées... Est-ce suffisant ou faut-il que j'en
fournisse un implémentation qui renverait une erreur (exception ?)
Je me suis appercu que le déclenchement de sync() se faisait avec
std::endl, mais pas avec std::ends. Pour quelle raison ?
Le dernier, je m'y attendais... sur le ITestStream l'operateur >>
considère l'espace comme séparateur au lieu du caractère LF.
Y'a-t-il un moyen de changer ce comportement ?