Mercurial > sdl-ios-xcode
view src/main/symbian/EKA2/vectorbuffer.h @ 4427:eada7e321df6 SDL-1.2
Fixed bug #943
Ozkan Sezer 2010-02-06 12:31:06 PST
Hi:
Here are some small fixes for compiling SDL against mingw-w64.
(see http://mingw-w64.sourceforge.net/ . Despite the name, it
supports both win32 and win64.) Two patches, one for SDL-1.2
and one for SDL-1.3 attached.
src/audio/windx5/directx.h and src/video/windx5/directx.h (both
SDL-1.2 and SDL-1.3.) I get compilation errors about some union
not having a member named u1 and alike, because of other system
headers being included before this one and them already defining
DUMMYUNIONNAME and stuff. This header probably assumes that those
stuff are defined in windef.h, but mingw-w64 headers define them
in _mingw.h. Easily fixed by moving NONAMELESSUNION definition to
the top of the file. SDL_dx5yuv.c (SDL-1.2-only) also needs to
include the header before SDL_video.h to avoid the same problem.
src/thread/win32/SDL_systhread.c (both SDL-1.2 and SDL-1.3.) :
The __GNUC__ case for pfnSDL_CurrentBeginThread is 32-bit centric
because _beginthreadex returns uintptr_t, not unsigned long which
is 32 bits in win64. Changing the return type to uintptr_t fixes
it.
Hope these are useful. Thanks.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Wed, 10 Mar 2010 15:04:13 +0000 |
parents | e85e65aec22f |
children |
line wrap: on
line source
/* vectorbuffer.cpp yet another circle buffer Markus Mertama */ #ifndef __VECTORBUFFER_H__ #define __VECTORBUFFER_H__ #include<e32std.h> #define VLOG(x) #define VECPANIC(x) VectorPanic(x, __LINE__) void VectorPanic(TInt, TInt); //int DEBUG_INT; NONSHARABLE_CLASS(TNodeBuffer) { public: protected: NONSHARABLE_CLASS(TNode) { public: static TNode* Empty(TUint8* iBuffer); static TNode* New(TNode* aPrev, const TDesC8& aData); const TUint8* Ptr() const; TInt Size() const; inline TNode* Succ(); static void SetSucc(TNode*& aNode); void Terminator(TNode* aNode); private: TNode* iSucc; }; }; inline TNodeBuffer::TNode* TNodeBuffer::TNode::Succ() { return iSucc; } template <TInt C> NONSHARABLE_CLASS(TVectorBuffer) : public TNodeBuffer { public: TVectorBuffer(); TInt Append(const TDesC8& aData); // TInt AppendOverwrite(const TDesC8& aData); TPtrC8 Shift(); TPtrC8 operator[](TInt aIndex) const; TInt Size() const; private: TInt GetRoom(TInt aSize) const; TInt Unreserved() const; private: TNode* iTop; TNode* iBottom; TInt iSize; TUint8 iBuffer[C]; }; template <TInt C> TVectorBuffer<C>::TVectorBuffer() : iSize(0) { Mem::FillZ(iBuffer, C); iTop = TNode::Empty(iBuffer); //these points to buffer iBottom = TNode::Empty(iBuffer); } template<TInt C > TInt TVectorBuffer<C>::Unreserved() const { __ASSERT_DEBUG(iBottom < iBottom->Succ(), VECPANIC(KErrCorrupt)); const TInt bytesbetween = reinterpret_cast<const TUint8*>(iBottom->Succ()) - reinterpret_cast<const TUint8*>(iTop); const TInt topsize = sizeof(TNode); if(bytesbetween > 0) //bytesbetween is room between bottom and top { //therefore free room is subracted from free space const TInt room = C - bytesbetween - topsize; return room; } if(bytesbetween == 0) { if(Size() > 0) return 0; else return C - topsize; } const TInt room = -bytesbetween - topsize; //free is space between pointers return room; } template <TInt C> TInt TVectorBuffer<C>::GetRoom(TInt aSize) const { const TInt bytesnew = sizeof(TNode) + aSize; const TInt room = Unreserved() - bytesnew; return room; } template <TInt C> TInt TVectorBuffer<C>::Append(const TDesC8& aData) //ei ole ok! { const TInt len = aData.Length(); if(GetRoom(len) < 0) { return KErrOverflow; } if(iBottom->Succ()->Ptr() - iBuffer > (C - (len + TInt(sizeof(TNode))))) { VLOG("rc"); // RDebug::Print(_L("vector: append")); TNode* p = TNode::Empty(iBuffer); iBottom->Terminator(p); iBottom = p; return Append(aData); // Append(); // iBottom = TNode::New(p, aData); //just append something into end } //DEBUG_INT++; iBottom = TNode::New(iBottom, aData); iSize += len; return KErrNone; } /* template <TInt C> TInt TVectorBuffer<C>::AppendOverwrite(const TDesC8& aData) //ei ole ok! { while(Append(aData) == KErrOverflow) { if(iTop->Succ() == NULL) { return KErrUnderflow; } //Shift(); //data is lost } return KErrNone; } */ template <TInt C> TPtrC8 TVectorBuffer<C>::Shift() { __ASSERT_ALWAYS(iTop->Succ() != NULL, VECPANIC(KErrUnderflow)); //can never pass-by bottom TNode* node = iTop; iTop = iTop->Succ(); if(iTop > node) { // DEBUG_INT--; iSize -= node->Size(); return TPtrC8(node->Ptr(), node->Size()); } else { // RDebug::Print(_L("vector: shift")); return Shift(); //this happens when buffer is terminated, and data lies in next } } template <TInt C> TInt TVectorBuffer<C>::Size() const { return iSize; } template <TInt C> TPtrC8 TVectorBuffer<C>::operator[](TInt aIndex) const { TInt index = 0; TNode* t = iTop->Size() > 0 ? iTop : iTop->Succ(); //eliminate terminator while(index < aIndex) { TNode* nt = t->Succ(); if(nt < t) { nt = nt->Succ(); } t = nt; if(t->Size() > 0) index++; __ASSERT_ALWAYS(t->Succ() != NULL, VECPANIC(KErrUnderflow)); //can never pass-by bottom } return t->Ptr(); } template <class T, TInt C> NONSHARABLE_CLASS(TVector) : public TVectorBuffer<C * sizeof(T)> { public: TVector(); TInt Append(const T& aData); const T& Shift(); TInt Size() const; const T& operator[](TInt aIndex) const; }; template <class T, TInt C> TVector<T, C>::TVector() : TVectorBuffer<C * sizeof(T)>() { } template <class T, TInt C> TInt TVector<T, C>::Append(const T& aData) { const TPckgC<T> data(aData); return TVectorBuffer<C * sizeof(T)>::Append(data); } template <class T, TInt C> const T& TVector<T, C>::Shift() { const TPtrC8 ptr = TVectorBuffer<C * sizeof(T)>::Shift(); return *(reinterpret_cast<const T*>(ptr.Ptr())); } template <class T, TInt C> TInt TVector<T, C>::Size() const { return TVectorBuffer<C * sizeof(T)>::Size() / sizeof(T); } template <class T, TInt C> const T& TVector<T, C>::operator[](TInt aIndex) const { const TPtrC8 ptr = TVectorBuffer<C * sizeof(T)>::operator[](aIndex); return *(reinterpret_cast<const T*>(ptr.Ptr())); } #endif