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