This is an automated email from the git hooks/post-receive script. smcv pushed a commit to branch debian/master in repository openjk.
commit 9e6541d35162193208761fe0cfe6d527a27229dd Author: bibendovsky <[email protected]> Date: Sat Jul 9 22:39:07 2016 +0300 Access fields or throw exceptions in templated members via methods only --- shared/qcommon/ojk_saved_game.cpp | 106 ++++++++++++++++++++++++++++++++ shared/qcommon/ojk_saved_game.h | 117 ++++++++++++++---------------------- shared/qcommon/ojk_saved_game_fwd.h | 44 +++++++++++--- 3 files changed, 185 insertions(+), 82 deletions(-) diff --git a/shared/qcommon/ojk_saved_game.cpp b/shared/qcommon/ojk_saved_game.cpp index 341f8cb..db70802 100644 --- a/shared/qcommon/ojk_saved_game.cpp +++ b/shared/qcommon/ojk_saved_game.cpp @@ -364,6 +364,31 @@ bool SavedGame::write_chunk( return true; } +SavedGame::Buffer& SavedGame::get_buffer() +{ + return io_buffer_; +} + +const SavedGame::Buffer& SavedGame::get_buffer() const +{ + return io_buffer_; +} + +int SavedGame::get_buffer_offset() const +{ + return static_cast<int>(io_buffer_offset_); +} + +uint8_t* SavedGame::get_current_data() +{ + return &io_buffer_[io_buffer_offset_]; +} + +const uint8_t* SavedGame::get_current_data() const +{ + return &io_buffer_[io_buffer_offset_]; +} + void SavedGame::rename( const std::string& old_base_file_name, const std::string& new_base_file_name) @@ -401,6 +426,20 @@ SavedGame& SavedGame::get_instance() return result; } +void SavedGame::throw_error( + const char* message) +{ + throw SavedGameException( + message); +} + +void SavedGame::throw_error( + const std::string& message) +{ + throw SavedGameException( + message); +} + void SavedGame::compress( const Buffer& src_buffer, Buffer& dst_buffer) @@ -554,5 +593,72 @@ std::string SavedGame::get_chunk_id_string( return result; } +void SavedGame::check_io_buffer( + int item_size, + int count) +{ + if (item_size <= 0) { + throw SavedGameException( + "Zero or negative item size."); + } + + if (count <= 0) { + throw SavedGameException( + "Zero or negative count."); + } + + const auto data_size = item_size * count; + + if ((io_buffer_offset_ + data_size) > io_buffer_.size()) { + throw SavedGameException( + "Not enough data."); + } +} + +void SavedGame::accomodate_io_buffer( + int item_size, + int count) +{ + if (item_size <= 0) { + throw SavedGameException( + "Zero or negative item size."); + } + + if (count <= 0) { + throw SavedGameException( + "Zero or negative count."); + } + + const auto data_size = item_size * count; + + const auto new_buffer_size = io_buffer_offset_ + data_size; + + io_buffer_.resize( + new_buffer_size); +} + +void SavedGame::advance_io_buffer( + int item_size, + int count) +{ + if (item_size <= 0) { + throw SavedGameException( + "Zero or negative item size."); + } + + if (count <= 0) { + throw SavedGameException( + "Zero or negative count."); + } + + const auto data_size = item_size * count; + io_buffer_offset_ += data_size; +} + +void SavedGame::reset_io_buffer_offset() +{ + io_buffer_offset_ = 0; +} + } // ojk diff --git a/shared/qcommon/ojk_saved_game.h b/shared/qcommon/ojk_saved_game.h index 4635736..d7c617a 100644 --- a/shared/qcommon/ojk_saved_game.h +++ b/shared/qcommon/ojk_saved_game.h @@ -20,56 +20,9 @@ namespace ojk { // I/O buffer manipulation. template<typename T> -void SavedGame::check_io_buffer( - int count) +T SavedGame::cast_buffer() { - if (count <= 0) { - throw SavedGameException( - "Zero or negative count."); - } - - const auto data_size = sizeof(T) * count; - - if ((io_buffer_offset_ + data_size) > io_buffer_.size()) { - throw SavedGameException( - "Not enough data."); - } -} - -template<typename T> -void SavedGame::accomodate_io_buffer( - int count) -{ - if (count <= 0) { - throw SavedGameException( - "Zero or negative count."); - } - - const auto data_size = sizeof(T) * count; - - const auto new_buffer_size = io_buffer_offset_ + data_size; - - io_buffer_.resize( - new_buffer_size); -} - -template<typename T> -T SavedGame::cast_io_buffer() -{ - return reinterpret_cast<T>(io_buffer_[io_buffer_offset_]); -} - -template<typename T> -void SavedGame::advance_io_buffer( - int count) -{ - if (count <= 0) { - throw SavedGameException( - "Zero or negative count."); - } - - const auto data_size = sizeof(T) * count; - io_buffer_offset_ += data_size; + return reinterpret_cast<T>(*get_current_data()); } // I/O buffer manipulation. @@ -121,7 +74,7 @@ bool SavedGame::write_chunk( const ChunkId chunk_id, const TSrc& src_value) { - io_buffer_offset_ = 0; + reset_io_buffer_offset(); write<TDst>( src_value); @@ -136,7 +89,7 @@ bool SavedGame::write_chunk( const TSrc* src_values, int src_count) { - io_buffer_offset_ = 0; + reset_io_buffer_offset(); write<TDst>( src_values, @@ -197,16 +150,18 @@ void SavedGame::read( TDst& dst_value, BooleanTag) { - constexpr auto src_size = sizeof(TSrc); + constexpr auto src_size = static_cast<int>(sizeof(TSrc)); - check_io_buffer<TSrc>(); + check_io_buffer( + src_size); - dst_value = (cast_io_buffer<const TSrc&>() != 0); + dst_value = (cast_buffer<const TSrc&>() != 0); // FIXME Byte order // - advance_io_buffer<TSrc>(); + advance_io_buffer( + src_size); } template<typename TSrc, typename TDst> @@ -214,14 +169,18 @@ void SavedGame::read( TDst& dst_value, NumericTag) { - check_io_buffer<TSrc>(); + constexpr auto src_size = static_cast<int>(sizeof(TSrc)); + + check_io_buffer( + src_size); - dst_value = static_cast<TDst>(cast_io_buffer<const TSrc&>()); + dst_value = static_cast<TDst>(cast_buffer<const TSrc&>()); // FIXME Byte order // - advance_io_buffer<TSrc>(); + advance_io_buffer( + src_size); } template<typename TSrc, typename TDst> @@ -254,7 +213,7 @@ void SavedGame::read( TDst& dst_value, ClassTag) { - throw SavedGameException( + throw_error( "Not implemented."); } @@ -298,12 +257,12 @@ void SavedGame::read( "Unsupported types."); if (!dst_values) { - throw SavedGameException( + throw_error( "Null pointer."); } if (dst_count < 0) { - throw SavedGameException( + throw_error( "Negative count."); } @@ -352,18 +311,22 @@ void SavedGame::read( int dst_count, InplaceTag) { - check_io_buffer<TDst>( + constexpr auto dst_size = static_cast<int>(sizeof(TDst)); + + check_io_buffer( + dst_size, dst_count); std::uninitialized_copy_n( - &cast_io_buffer<const TDst&>(), + &cast_buffer<const TDst&>(), dst_count, dst_values); // FIXME Byte order // - advance_io_buffer<TDst>( + advance_io_buffer( + dst_size, dst_count); } @@ -437,14 +400,18 @@ void SavedGame::write( const TSrc& src_value, NumericTag) { - accomodate_io_buffer<TSrc>(); + constexpr auto src_size = static_cast<int>(sizeof(TSrc)); + + accomodate_io_buffer( + src_size); - cast_io_buffer<TDst&>() = static_cast<TDst>(src_value); + cast_buffer<TDst&>() = static_cast<TDst>(src_value); // FIXME Byte order // - advance_io_buffer<TSrc>(); + advance_io_buffer( + src_size); } template<typename TDst, typename TSrc> @@ -470,7 +437,7 @@ void SavedGame::write( const TSrc& src_value, ClassTag) { - throw SavedGameException( + throw_error( "Not implemented."); } @@ -514,12 +481,12 @@ void SavedGame::write( "Unsupported types."); if (!src_values) { - throw SavedGameException( + throw_error( "Null pointer."); } if (src_count < 0) { - throw SavedGameException( + throw_error( "Negative count."); } @@ -568,18 +535,22 @@ void SavedGame::write( int src_count, InplaceTag) { - accomodate_io_buffer<TSrc>( + constexpr auto src_size = static_cast<int>(sizeof(TSrc)); + + accomodate_io_buffer( + src_size, src_count); std::uninitialized_copy_n( src_values, src_count, - &cast_io_buffer<TSrc&>()); + &cast_buffer<TSrc&>()); // FIXME Byte order // - advance_io_buffer<TSrc>( + advance_io_buffer( + src_size, src_count); } diff --git a/shared/qcommon/ojk_saved_game_fwd.h b/shared/qcommon/ojk_saved_game_fwd.h index feef931..937b8c6 100644 --- a/shared/qcommon/ojk_saved_game_fwd.h +++ b/shared/qcommon/ojk_saved_game_fwd.h @@ -11,7 +11,6 @@ #include <cstdint> #include <string> #include <vector> -#include "ojk_saved_game_exception.h" namespace ojk { @@ -21,6 +20,7 @@ class SavedGame { public: using ChunkId = uint32_t; + using Buffer = std::vector<uint8_t>; SavedGame(); @@ -110,6 +110,24 @@ public: int src_count); + // Returns an I/O buffer. + Buffer& get_buffer(); + + // Returns an I/O buffer. + const Buffer& get_buffer() const; + + // Returns an I/O buffer offset; + int get_buffer_offset() const; + + uint8_t* get_current_data(); + + const uint8_t* get_current_data() const; + + // Casts referenced data at current position into a specified type. + template<typename T> + T cast_buffer(); + + // Renames a saved game file. static void rename( const std::string& old_base_file_name, @@ -124,7 +142,6 @@ public: private: - using Buffer = std::vector<uint8_t>; using BufferOffset = Buffer::size_type; using Paths = std::vector<std::string>; @@ -158,6 +175,15 @@ private: bool is_write_failed_; + // Throws an exception. + static void throw_error( + const char* message); + + // Throws an exception. + static void throw_error( + const std::string& message); + + // Compresses data. static void compress( const Buffer& src_buffer, @@ -177,29 +203,29 @@ private: bool is_open); + // Returns a string representation of a chunk id. static std::string get_chunk_id_string( uint32_t chunk_id); // Checks if there is enough data for reading in the I/O buffer. - template<typename T> void check_io_buffer( + int item_size, int count = 1); // Resizes the I/O buffer according to desire size of data to write. - template<typename T> void accomodate_io_buffer( + int item_size, int count = 1); - // Casts I/O buffer data at the current offset. - template<typename T> - T cast_io_buffer(); - // Advances the current I/O buffer offset. - template<typename T> void advance_io_buffer( + int item_size, int count = 1); + // Resets I/O buffer offset to zero. + void reset_io_buffer_offset(); + template<typename TSrc, typename TDst> void read( -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/openjk.git _______________________________________________ Pkg-games-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-games-commits

