* Cleanup.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37646 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2010-07-21 11:23:42 +00:00
parent 866e21d3a6
commit f6a57629c3
+42 -30
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2006-2007, Haiku, Inc. All Rights Reserved. * Copyright 2006-2010, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
*/ */
#ifndef NET_BUFFER_UTILITIES_H #ifndef NET_BUFFER_UTILITIES_H
@@ -11,11 +11,13 @@
extern net_buffer_module_info* gBufferModule; extern net_buffer_module_info* gBufferModule;
class NetBufferModuleGetter { class NetBufferModuleGetter {
public: public:
static net_buffer_module_info *Get() { return gBufferModule; } static net_buffer_module_info *Get() { return gBufferModule; }
}; };
//! A class to access a field safely across node boundaries //! A class to access a field safely across node boundaries
template<typename Type, int Offset, typename Module = NetBufferModuleGetter> template<typename Type, int Offset, typename Module = NetBufferModuleGetter>
class NetBufferFieldReader { class NetBufferFieldReader {
@@ -24,41 +26,36 @@ class NetBufferFieldReader {
: :
fBuffer(buffer) fBuffer(buffer)
{ {
fStatus = Module::Get()->direct_access(fBuffer, Offset, fStatus = Module::Get()->direct_access(fBuffer, Offset, sizeof(Type),
sizeof(Type), (void **)&fData); (void**)&fData);
if (fStatus != B_OK) { if (fStatus != B_OK) {
fStatus = Module::Get()->read(fBuffer, Offset, fStatus = Module::Get()->read(fBuffer, Offset, &fDataBuffer,
&fDataBuffer, sizeof(Type)); sizeof(Type));
fData = &fDataBuffer; fData = &fDataBuffer;
} }
} }
status_t status_t Status() const
Status() const
{ {
return fStatus; return fStatus;
} }
Type & Type& Data() const
Data() const
{ {
return *fData; return *fData;
} }
Type * Type* operator->() const
operator->() const
{ {
return fData; return fData;
} }
Type & Type& operator*() const
operator*() const
{ {
return *fData; return *fData;
} }
void void Sync()
Sync()
{ {
if (fBuffer == NULL || fStatus < B_OK) if (fBuffer == NULL || fStatus < B_OK)
return; return;
@@ -70,7 +67,9 @@ class NetBufferFieldReader {
} }
protected: protected:
NetBufferFieldReader() {} NetBufferFieldReader()
{
}
net_buffer* fBuffer; net_buffer* fBuffer;
status_t fStatus; status_t fStatus;
@@ -78,34 +77,41 @@ class NetBufferFieldReader {
Type fDataBuffer; Type fDataBuffer;
}; };
//! Writes back any changed data on destruction
template<typename Type, int Offset, typename Module = NetBufferModuleGetter> template<typename Type, int Offset, typename Module = NetBufferModuleGetter>
class NetBufferField : public NetBufferFieldReader<Type, Offset, Module> { class NetBufferField : public NetBufferFieldReader<Type, Offset, Module> {
public: public:
NetBufferField(net_buffer* buffer) NetBufferField(net_buffer* buffer)
: NetBufferFieldReader<Type, Offset, Module>(buffer) :
{} NetBufferFieldReader<Type, Offset, Module>(buffer)
{
}
~NetBufferField() ~NetBufferField()
{ {
// Note, "this->" is needed here for GCC4
this->Sync(); this->Sync();
} }
}; };
//! Can remove the header from the buffer
template<typename Type, typename Module = NetBufferModuleGetter> template<typename Type, typename Module = NetBufferModuleGetter>
class NetBufferHeaderReader : public NetBufferFieldReader<Type, 0, Module> { class NetBufferHeaderReader : public NetBufferFieldReader<Type, 0, Module> {
public: public:
NetBufferHeaderReader(net_buffer* buffer) NetBufferHeaderReader(net_buffer* buffer)
: NetBufferFieldReader<Type, 0, Module>(buffer) :
{} NetBufferFieldReader<Type, 0, Module>(buffer)
void
Remove()
{ {
this->Remove(sizeof(Type));
} }
void void Remove()
Remove(size_t bytes) {
Remove(sizeof(Type));
}
void Remove(size_t bytes)
{ {
if (this->fBuffer != NULL) { if (this->fBuffer != NULL) {
Module::Get()->remove_header(this->fBuffer, bytes); Module::Get()->remove_header(this->fBuffer, bytes);
@@ -114,12 +120,16 @@ class NetBufferHeaderReader : public NetBufferFieldReader<Type, 0, Module> {
} }
}; };
//! Removes the header on destruction
template<typename Type, typename Module = NetBufferModuleGetter> template<typename Type, typename Module = NetBufferModuleGetter>
class NetBufferHeaderRemover : public NetBufferHeaderReader<Type, Module> { class NetBufferHeaderRemover : public NetBufferHeaderReader<Type, Module> {
public: public:
NetBufferHeaderRemover(net_buffer* buffer) NetBufferHeaderRemover(net_buffer* buffer)
: NetBufferHeaderReader<Type, Module>(buffer) :
{} NetBufferHeaderReader<Type, Module>(buffer)
{
}
~NetBufferHeaderRemover() ~NetBufferHeaderRemover()
{ {
@@ -127,7 +137,8 @@ class NetBufferHeaderRemover : public NetBufferHeaderReader<Type, Module> {
} }
}; };
//! A class to add a header to a buffer
//! A class to add a header to a buffer, syncs itself on destruction
template<typename Type, typename Module = NetBufferModuleGetter> template<typename Type, typename Module = NetBufferModuleGetter>
class NetBufferPrepend : public NetBufferFieldReader<Type, 0, Module> { class NetBufferPrepend : public NetBufferFieldReader<Type, 0, Module> {
public: public:
@@ -136,7 +147,7 @@ class NetBufferPrepend : public NetBufferFieldReader<Type, 0, Module> {
this->fBuffer = buffer; this->fBuffer = buffer;
this->fStatus = Module::Get()->prepend_size(buffer, size, this->fStatus = Module::Get()->prepend_size(buffer, size,
(void **)&(this->fData)); (void**)&this->fData);
if (this->fStatus == B_OK && this->fData == NULL) if (this->fStatus == B_OK && this->fData == NULL)
this->fData = &this->fDataBuffer; this->fData = &this->fDataBuffer;
} }
@@ -147,4 +158,5 @@ class NetBufferPrepend : public NetBufferFieldReader<Type, 0, Module> {
} }
}; };
#endif // NET_BUFFER_UTILITIES_H #endif // NET_BUFFER_UTILITIES_H