Index: skia/sgl/SkDeque.cpp |
=================================================================== |
--- skia/sgl/SkDeque.cpp (revision 16859) |
+++ skia/sgl/SkDeque.cpp (working copy) |
@@ -1,252 +0,0 @@ |
-/* libs/graphics/sgl/SkDeque.cpp |
-** |
-** Copyright 2006, The Android Open Source Project |
-** |
-** Licensed under the Apache License, Version 2.0 (the "License"); |
-** you may not use this file except in compliance with the License. |
-** You may obtain a copy of the License at |
-** |
-** http://www.apache.org/licenses/LICENSE-2.0 |
-** |
-** Unless required by applicable law or agreed to in writing, software |
-** distributed under the License is distributed on an "AS IS" BASIS, |
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-** See the License for the specific language governing permissions and |
-** limitations under the License. |
-*/ |
- |
-#include "SkDeque.h" |
- |
-#define INIT_ELEM_COUNT 1 // should we let the caller set this? |
- |
-struct SkDeque::Head { |
- Head* fNext; |
- Head* fPrev; |
- char* fBegin; // start of used section in this chunk |
- char* fEnd; // end of used section in this chunk |
- char* fStop; // end of the allocated chunk |
- |
- char* start() { return (char*)(this + 1); } |
- const char* start() const { return (const char*)(this + 1); } |
- |
- void init(size_t size) { |
- fNext = fPrev = NULL; |
- fBegin = fEnd = NULL; |
- fStop = (char*)this + size; |
- } |
-}; |
- |
-SkDeque::SkDeque(size_t elemSize) |
- : fElemSize(elemSize), fInitialStorage(NULL), fCount(0) { |
- fFront = fBack = NULL; |
-} |
- |
-SkDeque::SkDeque(size_t elemSize, void* storage, size_t storageSize) |
- : fElemSize(elemSize), fInitialStorage(storage), fCount(0) { |
- SkASSERT(storageSize == 0 || storage != NULL); |
- |
- if (storageSize >= sizeof(Head) + elemSize) { |
- fFront = (Head*)storage; |
- fFront->init(storageSize); |
- } else { |
- fFront = NULL; |
- } |
- fBack = fFront; |
-} |
- |
-SkDeque::~SkDeque() { |
- Head* head = fFront; |
- Head* initialHead = (Head*)fInitialStorage; |
- |
- while (head) { |
- Head* next = head->fNext; |
- if (head != initialHead) { |
- sk_free(head); |
- } |
- head = next; |
- } |
-} |
- |
-const void* SkDeque::front() const { |
- Head* front = fFront; |
- |
- if (NULL == front) { |
- return NULL; |
- } |
- if (NULL == front->fBegin) { |
- front = front->fNext; |
- if (NULL == front) { |
- return NULL; |
- } |
- } |
- SkASSERT(front->fBegin); |
- return front->fBegin; |
-} |
- |
-const void* SkDeque::back() const { |
- Head* back = fBack; |
- |
- if (NULL == back) { |
- return NULL; |
- } |
- if (NULL == back->fEnd) { // marked as deleted |
- back = back->fPrev; |
- if (NULL == back) { |
- return NULL; |
- } |
- } |
- SkASSERT(back->fEnd); |
- return back->fEnd - fElemSize; |
-} |
- |
-void* SkDeque::push_front() { |
- fCount += 1; |
- |
- if (NULL == fFront) { |
- fFront = (Head*)sk_malloc_throw(sizeof(Head) + |
- INIT_ELEM_COUNT * fElemSize); |
- fFront->init(sizeof(Head) + INIT_ELEM_COUNT * fElemSize); |
- fBack = fFront; // update our linklist |
- } |
- |
- Head* first = fFront; |
- char* begin; |
- |
- if (NULL == first->fBegin) { |
- INIT_CHUNK: |
- first->fEnd = first->fStop; |
- begin = first->fStop - fElemSize; |
- } else { |
- begin = first->fBegin - fElemSize; |
- if (begin < first->start()) { // no more room in this chunk |
- // should we alloc more as we accumulate more elements? |
- size_t size = sizeof(Head) + INIT_ELEM_COUNT * fElemSize; |
- |
- first = (Head*)sk_malloc_throw(size); |
- first->init(size); |
- first->fNext = fFront; |
- fFront->fPrev = first; |
- fFront = first; |
- goto INIT_CHUNK; |
- } |
- } |
- |
- first->fBegin = begin; |
- return begin; |
-} |
- |
-void* SkDeque::push_back() { |
- fCount += 1; |
- |
- if (NULL == fBack) { |
- fBack = (Head*)sk_malloc_throw(sizeof(Head) + |
- INIT_ELEM_COUNT * fElemSize); |
- fBack->init(sizeof(Head) + INIT_ELEM_COUNT * fElemSize); |
- fFront = fBack; // update our linklist |
- } |
- |
- Head* last = fBack; |
- char* end; |
- |
- if (NULL == last->fBegin) { |
- INIT_CHUNK: |
- last->fBegin = last->start(); |
- end = last->fBegin + fElemSize; |
- } else { |
- end = last->fEnd + fElemSize; |
- if (end > last->fStop) { // no more room in this chunk |
- // should we alloc more as we accumulate more elements? |
- size_t size = sizeof(Head) + INIT_ELEM_COUNT * fElemSize; |
- |
- last = (Head*)sk_malloc_throw(size); |
- last->init(size); |
- last->fPrev = fBack; |
- fBack->fNext = last; |
- fBack = last; |
- goto INIT_CHUNK; |
- } |
- } |
- |
- last->fEnd = end; |
- return end - fElemSize; |
-} |
- |
-void SkDeque::pop_front() { |
- SkASSERT(fCount > 0); |
- fCount -= 1; |
- |
- Head* first = fFront; |
- |
- SkASSERT(first != NULL); |
- |
- if (first->fBegin == NULL) { // we were marked empty from before |
- first = first->fNext; |
- first->fPrev = NULL; |
- sk_free(fFront); |
- fFront = first; |
- SkASSERT(first != NULL); // else we popped too far |
- } |
- |
- char* begin = first->fBegin + fElemSize; |
- SkASSERT(begin <= first->fEnd); |
- |
- if (begin < fFront->fEnd) { |
- first->fBegin = begin; |
- } else { |
- first->fBegin = first->fEnd = NULL; // mark as empty |
- } |
-} |
- |
-void SkDeque::pop_back() { |
- SkASSERT(fCount > 0); |
- fCount -= 1; |
- |
- Head* last = fBack; |
- |
- SkASSERT(last != NULL); |
- |
- if (last->fEnd == NULL) { // we were marked empty from before |
- last = last->fPrev; |
- last->fNext = NULL; |
- sk_free(fBack); |
- fBack = last; |
- SkASSERT(last != NULL); // else we popped too far |
- } |
- |
- char* end = last->fEnd - fElemSize; |
- SkASSERT(end >= last->fBegin); |
- |
- if (end > last->fBegin) { |
- last->fEnd = end; |
- } else { |
- last->fBegin = last->fEnd = NULL; // mark as empty |
- } |
-} |
- |
-/////////////////////////////////////////////////////////////////////////////// |
- |
-SkDeque::Iter::Iter(const SkDeque& d) : fElemSize(d.fElemSize) { |
- fHead = d.fFront; |
- while (fHead != NULL && fHead->fBegin == NULL) { |
- fHead = fHead->fNext; |
- } |
- fPos = fHead ? fHead->fBegin : NULL; |
-} |
- |
-void* SkDeque::Iter::next() { |
- char* pos = fPos; |
- |
- if (pos) { // if we were valid, try to move to the next setting |
- char* next = pos + fElemSize; |
- SkASSERT(next <= fHead->fEnd); |
- if (next == fHead->fEnd) { // exhausted this chunk, move to next |
- do { |
- fHead = fHead->fNext; |
- } while (fHead != NULL && fHead->fBegin == NULL); |
- next = fHead ? fHead->fBegin : NULL; |
- } |
- fPos = next; |
- } |
- return pos; |
-} |
- |