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#include "word_stream_impl.h"
184df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
194df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ninamespace android {
204df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ninamespace spirit {
214df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
224df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang NiWordStreamImpl::WordStreamImpl() {}
234df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
244df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang NiWordStreamImpl::WordStreamImpl(const std::vector<uint32_t> &words)
254df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    : mWords(words), mIter(mWords.begin()) {}
264df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
274df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang NiWordStreamImpl::WordStreamImpl(std::vector<uint32_t> &&words)
284df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    : mWords(words), mIter(mWords.begin()) {}
294df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
303f30b6202dd5ad6ff66959131d216405850ed152Yang NiWordStreamImpl &WordStreamImpl::operator<<(const std::string &str) {
313f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  const size_t len = str.length();
323f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  const uint32_t *begin = (uint32_t *)str.c_str();
333f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  const uint32_t *end = begin + (len / 4);
344df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  mWords.insert(mWords.end(), begin, end);
354df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
364df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  uint32_t lastWord = *end;
374df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  uint32_t mask = 0xFF;
384df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  bool clear = false;
394df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  for (int i = 0; i < 4; i++, mask <<= 8) {
404df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    if (clear) {
414df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni      lastWord &= ~mask;
424df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    } else {
434df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni      clear = ((lastWord & mask) == 0);
444df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    }
454df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  }
464df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  mWords.push_back(lastWord);
474df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  return *this;
484df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni}
494df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
503f30b6202dd5ad6ff66959131d216405850ed152Yang NiWordStreamImpl &WordStreamImpl::operator>>(std::string *str) {
513f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  const char *s = (const char *)&*mIter;
523f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  str->assign(s);
533f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  while (*mIter++ & 0xFF000000) {
543f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  }
554df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  return *this;
564df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni}
574df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
584df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni} // namespace spirit
594df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni} // namespace android
60