diff options
| author | ljfa-ag <ljfa-ag@web.de> | 2015-08-12 13:07:49 +0200 |
|---|---|---|
| committer | ljfa-ag <ljfa-ag@web.de> | 2015-08-12 13:39:25 +0200 |
| commit | 84e7f93b8760980af5fea0475b4550f8be04dae2 (patch) | |
| tree | 6992a11719a9d5224555e40c5747c5d63ddaff2e /include | |
| parent | 82a52081693135ec6b0294994db88b47f42e706b (diff) | |
| download | Project-Tick-84e7f93b8760980af5fea0475b4550f8be04dae2.tar.gz Project-Tick-84e7f93b8760980af5fea0475b4550f8be04dae2.zip | |
Lay foundations for stream writing
Diffstat (limited to 'include')
| -rw-r--r-- | include/io/stream_writer.h | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/include/io/stream_writer.h b/include/io/stream_writer.h new file mode 100644 index 0000000000..ea3dcd1c58 --- /dev/null +++ b/include/io/stream_writer.h @@ -0,0 +1,90 @@ +/* + * libnbt++ - A library for the Minecraft Named Binary Tag format. + * Copyright (C) 2013, 2015 ljfa-ag + * + * This file is part of libnbt++. + * + * libnbt++ is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * libnbt++ 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with libnbt++. If not, see <http://www.gnu.org/licenses/>. + */ +#ifndef STREAM_WRITER_H_INCLUDED +#define STREAM_WRITER_H_INCLUDED + +#include "tag.h" +#include "endian_str.h" +#include <iosfwd> +#include <stdexcept> + +namespace nbt +{ +namespace io +{ + +///Exception that gets thrown when writing is not successful +class output_error : public std::runtime_error +{ + using std::runtime_error::runtime_error; +}; + +/** + * @brief Helper class for writing NBT tags to output streams + */ +class stream_writer +{ +public: + /** + * @param os the stream to write to + * @param e the byte order of the written data. The Java edition + * of Minecraft uses Big Endian, the Pocket edition uses Little Endian + */ + explicit stream_writer(std::ostream& os, endian::endian e = endian::big) noexcept; + + ///Returns the stream + std::ostream& get_ostr() const; + ///Returns the byte order + endian::endian get_endian() const; + + /** + * @brief Writes a tag type to the stream + */ + void write_type(tag_type tt); + + /** + * @brief Writes a binary number to the stream + */ + template<class T> + void write_num(T x); + + /** + * @brief Writes an NBT string to the stream + * + * An NBT string consists of two bytes indicating the length, followed by + * the characters encoded in modified UTF-8. + */ + void write_string(const std::string& str); + +private: + std::ostream& os; + const endian::endian endian; +}; + +template<class T> +void stream_writer::write_num(T x) +{ + endian::write(os, x, endian); +} + +} +} + +#endif // STREAM_WRITER_H_INCLUDED |
