1
2/*
3 * Copyright 2006 The Android Open Source Project
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9
10#ifndef SkDeque_DEFINED
11#define SkDeque_DEFINED
12
13#include "SkTypes.h"
14
15class SK_API SkDeque : SkNoncopyable {
16public:
17    explicit SkDeque(size_t elemSize);
18    SkDeque(size_t elemSize, void* storage, size_t storageSize);
19    ~SkDeque();
20
21    bool    empty() const { return 0 == fCount; }
22    int     count() const { return fCount; }
23    size_t  elemSize() const { return fElemSize; }
24
25    const void* front() const;
26    const void* back() const;
27
28    void* front() {
29        return (void*)((const SkDeque*)this)->front();
30    }
31
32    void* back() {
33        return (void*)((const SkDeque*)this)->back();
34    }
35
36    void* push_front();
37    void* push_back();
38
39    void pop_front();
40    void pop_back();
41
42private:
43    struct Head;
44
45public:
46    class F2BIter {
47    public:
48        /**
49         * Creates an uninitialized iterator. Must be reset()
50         */
51        F2BIter();
52
53        F2BIter(const SkDeque& d);
54        void* next();
55
56        void reset(const SkDeque& d);
57
58    private:
59        SkDeque::Head*  fHead;
60        char*           fPos;
61        size_t          fElemSize;
62    };
63
64private:
65    Head*   fFront;
66    Head*   fBack;
67    size_t  fElemSize;
68    void*   fInitialStorage;
69    int     fCount;
70
71    friend class Iter;
72};
73
74#endif
75