/* * This file is a part of PikoTools * and is distributed under the (new) BSD licence. * Author: Tomasz Sowa */ /* * Copyright (c) 2012, Tomasz Sowa * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * * 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. * * * Neither the name Tomasz Sowa nor the names of contributors to this * project may be used to endorse or promote products derived * from this software without specific prior written permission. * * 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. */ #ifndef headerfile_picotools_space_spacetojson #define headerfile_picotools_space_spacetojson #include "space.h" namespace PT { class SpaceToJSON { public: template void Serialize(Space & space, Stream & out, bool use_indents = false, int level = 0) const; template void SerializeTableSingle(Space & space, Stream & out, bool use_indents, int level) const; template void SerializeTableMulti(Space & space, Stream & out, bool use_indents, int level) const; template static void PrintToken(Stream & out, const StringType & str); template static void PrintLevel(Stream & out, bool use_indents, int level); private: bool HasUnnamedSpace(Space & space) const; }; template void SpaceToJSON::PrintLevel(Stream & out, bool use_indents, int level) { if( use_indents ) { for(int i=0 ; i void SpaceToJSON::PrintToken(Stream & out, const StringType & str) { out << '\"'; for(size_t i=0 ; i void SpaceToJSON::SerializeTableSingle(Space & space, Stream & out, bool use_indents, int level) const { Space::TableSingle::const_iterator i; size_t index = 0; for(i=space.table_single.begin() ; i != space.table_single.end() ; ++i, ++index) { PrintLevel(out, use_indents, level); PrintToken(out, i->first); out << L": "; PrintToken(out, i->second); if( index + 1 < space.table_single.size() || !space.table.empty() ) out << ','; out << '\n'; } } template void SpaceToJSON::SerializeTableMulti(Space & space, Stream & out, bool use_indents, int level) const { Space::Table::const_iterator i2; size_t v; size_t index = 0; for(i2 = space.table.begin() ; i2 != space.table.end() ; ++i2, ++index) { PrintLevel(out, use_indents, level); PrintToken(out, i2->first); out << L": "; if( i2->second.size() != 1 ) out << '['; for(v = 0 ; v < i2->second.size() ; ++v) { if( v > 0 ) PrintLevel(out, use_indents, level + i2->first.size() + 3); PrintToken(out, i2->second[v]); if( v + 1 < i2->second.size() ) out << L",\n"; } if( i2->second.size() != 1 ) out << ']'; if( index + 1 < space.table.size() || !space.spaces.empty() ) out << ','; out << '\n'; } } template void SpaceToJSON::Serialize(Space & space, Stream & out, bool use_indents, int level) const { // if( level > 0 ) // out << '\n'; PrintLevel(out, use_indents, level); if( !space.name.empty() ) { PrintToken(out, space.name); out << L": "; } bool is_table = HasUnnamedSpace(space); if( is_table ) out << L"[\n"; else out << L"{\n"; // !! what about if table or table.single has values // and there is the table? (not supported yet) SerializeTableSingle(space, out, use_indents, level); SerializeTableMulti(space, out, use_indents, level); for(size_t i=0 ; i