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