aboutsummaryrefslogtreecommitdiffhomepage
path: root/include/core/SkDataSet.h
blob: 2e5d96e68ab23245fa99189d552dd995f0163c33 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/*
 * Copyright 2012 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef SkDataSet_DEFINED
#define SkDataSet_DEFINED

#include "SkData.h"
#include "SkFlattenable.h"

class SkStream;
class SkWStream;

class SkDataSet : public SkFlattenable {
public:
    /**
     *  Returns a new empty dataset. Note: since SkDataSet is immutable, this
     *  "new" set may be the same one that was returned before, but each
     *  returned object must have its reference-count balanced regardless.
     *
     *  SkDataSet* empty = SkDataSet::NewEmpty();
     *  ...
     *  empty->unref();
     */
    static SkDataSet* NewEmpty();

    struct Pair {
        const char* fKey;
        SkData*     fValue;
    };

    SkDataSet(const char key[], SkData* value);
    SkDataSet(const Pair[], int count);
    virtual ~SkDataSet();

    bool isEmpty() const { return 0 == fCount; }
    int count() const { return fCount; }
    SkData* find(const char name[]) const;

    class Iter {
    public:
        Iter(const SkDataSet& ds) {
            fPair = ds.fPairs;
            fStop = ds.fPairs + ds.fCount;
        }

        const char* key() const {
            SkASSERT(!this->done());
            return fPair->fKey;
        }

        SkData* value() const {
            SkASSERT(!this->done());
            return fPair->fValue;
        }

        bool done() const { return fPair >= fStop; }
        void next() {
            SkASSERT(!this->done());
            fPair += 1;
        }

    private:
        const SkDataSet::Pair* fPair;
        const SkDataSet::Pair* fStop;
    };

    explicit SkDataSet(SkStream*);
    void writeToStream(SkWStream*) const;

    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDataSet)

protected:
    SkDataSet(SkFlattenableReadBuffer&);
    virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE;

private:
    int32_t     fCount;
    uint32_t    fKeySize;
    Pair*       fPairs;

    typedef SkFlattenable INHERITED;
};

#endif