Bonjour,
Je me suis rendu compte que le potentiel de la classe sf::Packet est beaucoup plus important que ceux qu'on en fait, et pour cause, on pourrait l'utiliser pour envoyer/recevoir des données binaires sérialisées, ce que boost par exemple ne gère pas (rien que çà !), à travers les flux de la STL. Ça permettrait de stocké des données sérialisées dans le DD par exemple. De plus, il suffirait de rendre compatible sa classe avec sf::Packet pour la rendre compatible avec toutes les STL : gain de temps et de simplicité.
J'ai une proposition d'implémentation ( toute simple et surtout optimisable ) :
std::istream& operator >> (std::istream& stream, sf::Packet& packet)
{
sf::Uint32 start = stream.tellg ();
stream.seekg (0, std::ios::end);
sf::Uint32 lenght = stream.tellg ();
lenght -= start;
stream.seekg (start, std::ios::beg);
char** buffer = new char* [lenght];
stream.read (*buffer,lenght);
packet.Append (*buffer,lenght);
return stream;
}
std::ostream& operator << (std::ostream& stream, sf::Packet& packet)
{
stream.write (packet.GetData (), packet.GetDataSize ());
return stream;
}
Remarqué la belle double réécriture de tampon ...
Sinon pour l'utiliser :
file << packet; // écriture
file >> packet; // lecture
Aussi je propose une autre amélioration des paquets, il serait bien de pouvoir utiliser l'opérateur & pour écrire ou lire dans les paquets. Le problème est que le compilateur ne sait pas dans quelle sens faire l'opération, c'est pour çà que je propose 2 classes qui ont comme seul caractéristique d’exister :
namespace sf
{
class InPacket : public Packet
{
public:
InPacket () : Packet () {}
};
class OutPacket : public Packet
{
public:
OutPacket () : Packet () {}
};
}
Il faut aussi gérer les données de base : (désolé pour le long fichier, je ne trouve de balise spoil/secret )
// *** *** *** IN *** *** ***
inline InPacket& operator& (InPacket& packet, bool e){
packet >> e;
return packet;
}
inline InPacket& operator& (InPacket& packet, Int8 e){
packet >> e;
return packet;
}
inline InPacket& operator& (InPacket& packet, Uint8 e){
packet >> e;
return packet;
}
inline InPacket& operator& (InPacket& packet, Int16 e){
packet >> e;
return packet;
}
inline InPacket& operator& (InPacket& packet, Uint16 e){
packet >> e;
return packet;
}
inline InPacket& operator& (InPacket& packet, Int32 e){
packet >> e;
return packet;
}
inline InPacket& operator& (InPacket& packet, Uint32 e){
packet >> e;
return packet;
}
inline InPacket& operator& (InPacket& packet, float e){
packet >> e;
return packet;
}
inline InPacket& operator& (InPacket& packet, double e){
packet >> e;
return packet;
}
inline InPacket& operator& (InPacket& packet, char* e){
packet >> e;
return packet;
}
inline InPacket& operator& (InPacket& packet, std::string& e){
packet >> e;
return packet;
}
inline InPacket& operator& (InPacket& packet, wchar_t* e){
packet >> e;
return packet;
}
inline InPacket& operator& (InPacket& packet, std::wstring& e){
packet >> e;
return packet;
}
// *** *** *** OUT *** *** ***
inline OutPacket& operator& (OutPacket& packet, bool e){
packet << e;
return packet;
}
inline OutPacket& operator& (OutPacket& packet, Int8 e){
packet << e;
return packet;
}
inline OutPacket& operator& (OutPacket& packet, Uint8 e){
packet << e;
return packet;
}
inline OutPacket& operator& (OutPacket& packet, Int16 e){
packet << e;
return packet;
}
inline OutPacket& operator& (OutPacket& packet, Uint16 e){
packet << e;
return packet;
}
inline OutPacket& operator& (OutPacket& packet, Int32 e){
packet << e;
return packet;
}
inline OutPacket& operator& (OutPacket& packet, Uint32 e){
packet << e;
return packet;
}
inline OutPacket& operator& (OutPacket& packet, float e){
packet << e;
return packet;
}
inline OutPacket& operator& (OutPacket& packet, double e){
packet << e;
return packet;
}
inline OutPacket& operator& (OutPacket& packet, char* e){
packet << e;
return packet;
}
inline OutPacket& operator& (OutPacket& packet, std::string& e){
packet << e;
return packet;
}
inline OutPacket& operator& (OutPacket& packet, wchar_t* e){
packet << e;
return packet;
}
inline OutPacket& operator& (OutPacket& packet, std::wstring& e){
packet << e;
return packet;
}
Pour l'utiliser :
struct Data
{
sf::Uint32 number;
sf::Uint32 anOtherNumber;
sf::Uint32 anImportantOne;
}
template <class Packet>
Packet& operator& (Packet& packet, Data& data)
{
sf::Uint32 version = 2;
packet & version;
switch (version)
{
case 2:
packet & anImportantOne;
case 1:
packet & data.anOtherNumber
case 0:
packet & data.number;
break;
default:
break;
}
return packet;
}
Voilà tout
!