blob: 3c4661ed17f5a4f5ecf0b2b092ef90c93667adb5 [file] [log] [blame]
// Copyright (c) 2013, Kenton Varda <[email protected]>
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "string-tree.h"
namespace kj {
StringTree::StringTree(Array<StringTree>&& pieces, StringPtr delim)
: size_(0),
branches(heapArray<Branch>(pieces.size())) {
if (pieces.size() > 0) {
if (pieces.size() > 1 && delim.size() > 0) {
text = heapString((pieces.size() - 1) * delim.size());
size_ = text.size();
}
branches[0].index = 0;
branches[0].content = kj::mv(pieces[0]);
size_ += pieces[0].size();
for (uint i = 1; i < pieces.size(); i++) {
if (delim.size() > 0) {
memcpy(text.begin() + (i - 1) * delim.size(), delim.begin(), delim.size());
}
branches[i].index = i * delim.size();
branches[i].content = kj::mv(pieces[i]);
size_ += pieces[i].size();
}
}
}
String StringTree::flatten() const {
String result = heapString(size());
flattenTo(result.begin());
return result;
}
void StringTree::flattenTo(char* __restrict__ target) const {
visit([&target](ArrayPtr<const char> text) {
memcpy(target, text.begin(), text.size());
target += text.size();
});
}
} // namespace kj