entity.h revision 3e5fbb6faf66488ba49c9d2396350ae567dba315
1/*
2 * Copyright 2017, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ENTITY_H
18#define ENTITY_H
19
20#include <memory>
21#include <vector>
22
23#include "word_stream.h"
24
25namespace android {
26namespace spirit {
27
28class Builder;
29class IVisitor;
30
31class Entity {
32public:
33  Entity() {}
34  Entity(Builder *b) : mBuilder(b) {}
35
36  virtual ~Entity() {}
37
38  virtual void accept(IVisitor *visitor) = 0;
39  virtual bool DeserializeInternal(InputWordStream &IS) = 0;
40  virtual void Serialize(OutputWordStream &OS) const;
41  virtual void dump() const {}
42
43  void setBuilder(Builder *builder) { mBuilder = builder; }
44
45protected:
46  Builder *mBuilder;
47};
48
49template <typename T> T *Deserialize(InputWordStream &IS) {
50  std::unique_ptr<T> entity(new T());
51  if (!entity->DeserializeInternal(IS)) {
52    return nullptr;
53  }
54  return entity.release();
55}
56
57template <typename T> T *Deserialize(const std::vector<uint32_t> &words) {
58  std::unique_ptr<InputWordStream> IS(InputWordStream::Create(words));
59  return Deserialize<T>(*IS);
60}
61
62template <class T>
63void DeserializeZeroOrMore(InputWordStream &IS, std::vector<T *> &all) {
64  while (auto entity = Deserialize<T>(IS)) {
65    all.push_back(entity);
66  }
67}
68
69template <class T>
70std::vector<uint32_t> Serialize(T* e) {
71  std::unique_ptr<OutputWordStream> OS(OutputWordStream::Create());
72  e->Serialize(*OS);
73  return OS->getWords();
74}
75
76} // namespace spirit
77} // namespace android
78
79#endif // ENTITY_H
80