Fix in asciimapsource

This commit is contained in:
King_DuckZ 2014-12-29 16:14:36 +01:00
parent 931acf3293
commit d5c199f3b9
4 changed files with 13 additions and 91 deletions

View file

@ -1,44 +0,0 @@
#ifndef id9B1C02049E474F6997D367932C4C2D21
#define id9B1C02049E474F6997D367932C4C2D21
#include "primitivetypes.hpp"
#include <iostream>
#include <vector>
#include <algorithm>
#include <memory>
#include <iterator>
//This code might need to be removed, but for now it's handy to read a simple
//ascii file into a vector without worrying too much about details.
//TODO: remove along with the code in the constructor
#include "implem/asciimap_parser.hpp"
#include <iomanip>
#include <stdexcept>
namespace dk {
template <typename T, size_t D>
class TileStreamer {
public:
typedef Vector<CoordinateScalarType, D> coords;
typedef std::unique_ptr<std::istream> StreamPtr;
explicit TileStreamer ( StreamPtr&& parStream );
TileStreamer ( const TileStreamer& ) = delete;
TileStreamer ( TileStreamer&& ) = default;
~TileStreamer ( void ) noexcept = default;
TileStreamer& operator= ( const TileStreamer& ) = delete;
void copy ( std::vector<T>& parDest, const coords& parFrom, const coords& parTo );
const coords& tilesCount ( void ) const { return m_count; }
private:
StreamPtr m_stream;
coords m_count;
std::vector<T> m_wholedata;
};
} //namespace dk
#include "implem/tilestreamer.inl"
#endif

View file

@ -1,13 +1,18 @@
#ifndef id263B7DAF9A1C40BB8517D5D328DF8A1B
#define id263B7DAF9A1C40BB8517D5D328DF8A1B
#include "primitivetypes.hpp"
#include "implem/vector.hpp"
#include <streambuf>
#include <vector>
#include <boost/iostreams/categories.hpp> // source_tag
namespace dkh {
class AsciiMapSource : std::streambuf {
class AsciiMapSource : public std::streambuf {
public:
typedef dk::Vector<dk::CoordinateScalarType, 2> coords;
typedef int MapTileType;
typedef boost::iostreams::source_tag category;
enum {
MapDimensions = 2
};
@ -22,13 +27,14 @@ namespace dkh {
AsciiMapSource ( I parDataFrom, I parDataTo );
~AsciiMapSource ( void ) noexcept = default;
const coords& mapSize ( void ) const noexcept { return m_mapSize; }
private:
void parse_map_data ( std::istream& parSrc );
std::vector<MapTileType> m_wholedata;
int m_width;
int m_height;
coords m_mapSize;
};
} //namespace dk
} //namespace dkh
#endif

View file

@ -1,40 +0,0 @@
namespace dk {
template <typename T, size_t D>
TileStreamer<T, D>::TileStreamer (StreamPtr&& parStream) :
m_stream(std::move(parStream))
{
//TODO: this loader /only/ works with 2D tilesets, remove it asap
typedef std::istream_iterator<char> DataIterator;
typedef boost::spirit::multi_pass<DataIterator> WrappedIterator;
*m_stream >> std::noskipws;
auto first = WrappedIterator(DataIterator(*m_stream));
auto last = WrappedIterator(DataIterator());
implem::AsciiMapGrammar<WrappedIterator, T> grammar(first);
const bool p = boost::spirit::qi::parse(
first,
last,
grammar,
m_wholedata
);
if (not p or last != first) {
throw std::runtime_error("Invalid data: can't parse file");
}
//Only look at the front. Besides a bug in spirit makes the other counts
//invalid, see
//http://boost.2283326.n4.nabble.com/Possible-bug-in-line-pos-iterator-td4636592.html
m_count.x() = grammar.lengths.front();
m_count.y() = m_wholedata.size() / m_count.x();
}
template <typename T, size_t D>
void TileStreamer<T, D>::copy (std::vector<T>& parDest, const coords& /*parFrom*/, const coords& /*parTo*/) {
parDest.clear();
parDest.reserve(m_wholedata.size());
std::copy(m_wholedata.begin(), m_wholedata.end(), std::back_inserter(parDest));
}
} //namespace dk

View file

@ -60,7 +60,7 @@ namespace dkh {
//Only look at the front. Besides a bug in spirit makes the other counts
//invalid, see
//http://boost.2283326.n4.nabble.com/Possible-bug-in-line-pos-iterator-td4636592.html
m_width = grammar.lengths.front();
m_height = m_wholedata.size() / m_width;
m_mapSize.x() = grammar.lengths.front();
m_mapSize.y() = m_wholedata.size() / m_mapSize.x();
}
} //namespace dk
} //namespace dkh