SkDeque.h revision 137a4ca42423bbb6d683067ea544c9a48f18f06c
10910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/*
20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
30910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
50910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * you may not use this file except in compliance with the License.
60910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * You may obtain a copy of the License at
70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * See the License for the specific language governing permissions and
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * limitations under the License.
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkDeque_DEFINED
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkDeque_DEFINED
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkTypes.h"
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
22137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenbergerclass SK_API SkDeque : SkNoncopyable {
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    explicit SkDeque(size_t elemSize);
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDeque(size_t elemSize, void* storage, size_t storageSize);
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    ~SkDeque();
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool    empty() const { return 0 == fCount; }
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int     count() const { return fCount; }
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    size_t  elemSize() const { return fElemSize; }
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const void* front() const;
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const void* back() const;
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void* front() {
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return (void*)((const SkDeque*)this)->front();
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void* back() {
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return (void*)((const SkDeque*)this)->back();
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void* push_front();
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void* push_back();
4571531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void pop_front();
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void pop_back();
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    struct Head;
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
5371531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger    class F2BIter {
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    public:
5505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        /**
5605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger         * Creates an uninitialized iterator. Must be reset()
5705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger         */
5805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        F2BIter();
5905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
6071531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger        F2BIter(const SkDeque& d);
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        void* next();
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        void reset(const SkDeque& d);
6405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    private:
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDeque::Head*  fHead;
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        char*           fPos;
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        size_t          fElemSize;
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Head*   fFront;
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Head*   fBack;
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    size_t  fElemSize;
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void*   fInitialStorage;
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int     fCount;
7771531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    friend class Iter;
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
82