/* * Project: MoleCuilder * Description: creates and alters molecular systems * Copyright (C) 2017 Frederik Heber. All rights reserved. * * * This file is part of MoleCuilder. * * MoleCuilder is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * MoleCuilder is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MoleCuilder. If not, see . */ /* * Graph6Reader.cpp * * Created on: Sep 26, 2017 * Author: heber */ // include config.h #ifdef HAVE_CONFIG_H #include #endif //#include "CodePatterns/MemDebug.hpp" #include "CodePatterns/Assert.hpp" #include "CodePatterns/Log.hpp" #include "Graph6Reader.hpp" const int Graph6Reader::packet_size(5); void Graph6Reader::operator()(std::istream &_graph_string) { std::istream_iterator iter(_graph_string); scan_num_nodes(iter); scan_edges(iter); } void Graph6Reader::scan_num_nodes(std::istream_iterator &_it) { //now we're one past the optional header //parse the number of nodes ASSERT(*_it >= 64, "The number of nodes is not properly encoded"); if (*_it <126) { //6-bit encoding num_nodes = *_it-64; } else if (*_it++ == 126) { unsigned int packets = 3; if (*_it == 126) { //36-bit encoding packets++; _it++; } for(unsigned int i =0; i126." ); } ++_it; } void Graph6Reader::next_edge(std::istream_iterator &_it) { unsigned int bit = 0; int cur_byte = 0; while(!bit && !eos) { if (++row==column) { column+=1; row = 0; } if (column>=num_nodes) { eos = true; break; } if (bit_pos<0) { ASSERT((*_it >= 63) && (*_it <= 126), "The input contains a non-printable ascii char in the matrix encoding"); cur_byte = (*_it) - 63; ++(_it); bit_pos = packet_size; } bit = cur_byte & (1<<(bit_pos--)); } } void Graph6Reader::scan_edges(std::istream_iterator &_it) { while(!eos) { next_edge(_it); if (!eos) { LOG(3, "DEBUG: Adding edge bit in (" << column << "," << row << ")"); edges.push_back(std::make_pair(column,row)); } } }