14df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni/*
24df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * Copyright 2017, The Android Open Source Project
34df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni *
44df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * Licensed under the Apache License, Version 2.0 (the "License");
54df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * you may not use this file except in compliance with the License.
64df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * You may obtain a copy of the License at
74df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni *
84df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni *     http://www.apache.org/licenses/LICENSE-2.0
94df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni *
104df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * Unless required by applicable law or agreed to in writing, software
114df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * distributed under the License is distributed on an "AS IS" BASIS,
124df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * See the License for the specific language governing permissions and
144df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * limitations under the License.
154df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni */
164df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
174df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#ifndef WORD_STREAM_H
184df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#define WORD_STREAM_H
194df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
203f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#include "core_defs.h"
213f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#include "types_generated.h"
223f30b6202dd5ad6ff66959131d216405850ed152Yang Ni
234df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#include <stdint.h>
244df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
253f30b6202dd5ad6ff66959131d216405850ed152Yang Ni#include <string>
264df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#include <vector>
274df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
284df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ninamespace android {
294df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ninamespace spirit {
304df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
314df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Nistruct IdRef;
324df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Niclass Instruction;
334df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
344df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Niclass InputWordStream {
354df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Nipublic:
364df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  static InputWordStream *Create();
374df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  static InputWordStream *Create(std::vector<uint32_t> &&words);
384df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  static InputWordStream *Create(const std::vector<uint32_t> &words);
394df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  static InputWordStream *Create(const std::vector<uint8_t> &bytes);
404df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  static InputWordStream *Create(const char *fileName);
414df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
424df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  virtual ~InputWordStream() {}
434df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
444df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  virtual bool empty() const = 0;
454df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  virtual uint32_t operator*() = 0;
464df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
474df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  virtual InputWordStream &operator>>(uint32_t *RHS) = 0;
484df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  virtual InputWordStream &operator>>(LiteralContextDependentNumber *num) = 0;
493f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  virtual InputWordStream &operator>>(std::string *str) = 0;
504df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
514df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  InputWordStream &operator>>(int32_t *RHS) { return *this >> (uint32_t *)RHS; }
524df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
534df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  InputWordStream &operator>>(OpCodeAndWordCount *codeCount) {
544df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    uint32_t word;
554df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    *this >> &word;
564df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    *codeCount = word;
574df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    return *this;
584df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  }
594df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
604df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  InputWordStream &operator>>(IdRef *RHS) {
614df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    // The referred instruction will be resolved later towards the end of the
624df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    // deserialization of the module after all instructions have been
634df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    // deserialized.
644df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    // It cannot be resolved here because it may be a forward reference.
654df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    RHS->mInstruction = nullptr;
664df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    return *this >> &RHS->mId;
674df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    ;
684df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  }
694df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
704df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  InputWordStream &operator>>(PairLiteralIntegerIdRef *RHS) {
714df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    return *this >> &RHS->mField0 >> &RHS->mField1;
724df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  }
734df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
744df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  InputWordStream &operator>>(PairIdRefLiteralInteger *RHS) {
754df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    return *this >> &RHS->mField0 >> &RHS->mField1;
764df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  }
774df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
784df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  InputWordStream &operator>>(PairIdRefIdRef *RHS) {
794df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    return *this >> &RHS->mField0 >> &RHS->mField1;
804df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  }
814df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
824df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#define HANDLE_ENUM(Enum)                                                      \
834df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  InputWordStream &operator>>(Enum *RHS) { return *this >> (uint32_t *)RHS; }
844df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#include "enum_dispatches_generated.h"
854df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#undef HANDLE_ENUM
864df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni};
874df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
884df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Niclass OutputWordStream {
894df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Nipublic:
904df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  static OutputWordStream *Create();
914df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
924df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  virtual ~OutputWordStream() {}
934df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
944df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  virtual std::vector<uint32_t> getWords() = 0;
954df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
964df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  virtual OutputWordStream &operator<<(const uint32_t RHS) = 0;
974df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  virtual OutputWordStream &
984df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  operator<<(const LiteralContextDependentNumber &RHS) = 0;
993f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  virtual OutputWordStream &operator<<(const std::string &str) = 0;
1004df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
1014df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  OutputWordStream &operator<<(const int32_t RHS) {
1024df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    return *this << (uint32_t)RHS;
1034df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  }
1044df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
1054df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  OutputWordStream &operator<<(const OpCodeAndWordCount codeCount) {
1064df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    return *this << (uint32_t)codeCount;
1074df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  }
1084df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
1094df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  OutputWordStream &operator<<(const IdRef &RHS) {
1104df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    return *this << RHS.mId;
1114df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  }
1124df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
1134df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  OutputWordStream &operator<<(const PairLiteralIntegerIdRef &RHS) {
1144df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    return *this << RHS.mField0 << RHS.mField1;
1154df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  }
1164df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
1174df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  OutputWordStream &operator<<(const PairIdRefLiteralInteger &RHS) {
1184df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    return *this << RHS.mField0 << RHS.mField1;
1194df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  }
1204df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
1214df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  OutputWordStream &operator<<(const PairIdRefIdRef &RHS) {
1224df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    return *this << RHS.mField0 << RHS.mField1;
1234df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  }
1244df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
1254df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#define HANDLE_ENUM(Enum)                                                      \
1264df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  OutputWordStream &operator<<(const Enum RHS) {                               \
1274df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    return *this << static_cast<uint32_t>(RHS);                                \
1284df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  }
1294df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#include "enum_dispatches_generated.h"
1304df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#undef HANDLE_ENUM
1314df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni};
1324df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
1334df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Niclass WordStream : public InputWordStream, public OutputWordStream {
1344df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Nipublic:
1354df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  static WordStream *Create();
1364df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  static WordStream *Create(const std::vector<uint32_t> &words);
1374df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
1384df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  virtual ~WordStream() {}
1394df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni};
1404df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
1414df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni} // namespace spirit
1424df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni} // namespace android
1434df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
1444df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#endif // WORD_STREAM_H
145