11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project
40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkDeque_DEFINED
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkDeque_DEFINED
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkTypes.h"
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
15137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenbergerclass SK_API SkDeque : SkNoncopyable {
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    explicit SkDeque(size_t elemSize);
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDeque(size_t elemSize, void* storage, size_t storageSize);
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    ~SkDeque();
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool    empty() const { return 0 == fCount; }
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int     count() const { return fCount; }
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    size_t  elemSize() const { return fElemSize; }
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const void* front() const;
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const void* back() const;
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void* front() {
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return (void*)((const SkDeque*)this)->front();
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void* back() {
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return (void*)((const SkDeque*)this)->back();
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void* push_front();
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void* push_back();
3871531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void pop_front();
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void pop_back();
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    struct Head;
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
4671531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger    class F2BIter {
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    public:
4805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        /**
4905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger         * Creates an uninitialized iterator. Must be reset()
5005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger         */
5105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        F2BIter();
5205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
5371531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger        F2BIter(const SkDeque& d);
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        void* next();
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        void reset(const SkDeque& d);
5705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    private:
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDeque::Head*  fHead;
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        char*           fPos;
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        size_t          fElemSize;
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Head*   fFront;
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Head*   fBack;
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    size_t  fElemSize;
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void*   fInitialStorage;
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int     fCount;
7071531ca1f484da5837be8017a0c83e5bff701587Derek Sollenberger
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    friend class Iter;
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
75