1/*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SkDataSet_DEFINED
9#define SkDataSet_DEFINED
10
11#include "SkData.h"
12#include "SkFlattenable.h"
13
14class SkStream;
15class SkWStream;
16
17class SkDataSet : public SkFlattenable {
18public:
19    /**
20     *  Returns a new empty dataset. Note: since SkDataSet is immutable, this
21     *  "new" set may be the same one that was returned before, but each
22     *  returned object must have its reference-count balanced regardless.
23     *
24     *  SkDataSet* empty = SkDataSet::NewEmpty();
25     *  ...
26     *  empty->unref();
27     */
28    static SkDataSet* NewEmpty();
29
30    struct Pair {
31        const char* fKey;
32        SkData*     fValue;
33    };
34
35    SkDataSet(const char key[], SkData* value);
36    SkDataSet(const Pair[], int count);
37    virtual ~SkDataSet();
38
39    bool isEmpty() const { return 0 == fCount; }
40    int count() const { return fCount; }
41    SkData* find(const char name[]) const;
42
43    class Iter {
44    public:
45        Iter(const SkDataSet& ds) {
46            fPair = ds.fPairs;
47            fStop = ds.fPairs + ds.fCount;
48        }
49
50        const char* key() const {
51            SkASSERT(!this->done());
52            return fPair->fKey;
53        }
54
55        SkData* value() const {
56            SkASSERT(!this->done());
57            return fPair->fValue;
58        }
59
60        bool done() const { return fPair >= fStop; }
61        void next() {
62            SkASSERT(!this->done());
63            fPair += 1;
64        }
65
66    private:
67        const SkDataSet::Pair* fPair;
68        const SkDataSet::Pair* fStop;
69    };
70
71    explicit SkDataSet(SkStream*);
72    void writeToStream(SkWStream*) const;
73
74    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDataSet)
75
76protected:
77    SkDataSet(SkFlattenableReadBuffer&);
78    virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE;
79
80private:
81    int32_t     fCount;
82    uint32_t    fKeySize;
83    Pair*       fPairs;
84
85    typedef SkFlattenable INHERITED;
86};
87
88#endif
89