Zipper made universally usable and documented.

This commit is contained in:
tamasmeszaros 2019-03-15 11:23:27 +01:00
parent dc7e75b522
commit 4643106be4

View File

@ -6,8 +6,10 @@
namespace Slic3r { namespace Slic3r {
// Class for creating zip archives.
class Zipper { class Zipper {
public: public:
// Three compression levels supported
enum e_compression { enum e_compression {
NO_COMPRESSION, NO_COMPRESSION,
FAST_COMPRESSION, FAST_COMPRESSION,
@ -29,23 +31,47 @@ public:
e_compression level = NO_COMPRESSION); e_compression level = NO_COMPRESSION);
~Zipper(); ~Zipper();
// No copies allwed, this is a file resource...
Zipper(const Zipper&) = delete; Zipper(const Zipper&) = delete;
Zipper& operator=(const Zipper&) = delete; Zipper& operator=(const Zipper&) = delete;
// Moving is fine.
Zipper(Zipper&&) = default; Zipper(Zipper&&) = default;
Zipper& operator=(Zipper&&) = default; Zipper& operator=(Zipper&&) = default;
/// Adding an entry means a file inside the new archive. Name param is the
/// name of the new file. To create directories, append a forward slash.
void add_entry(const std::string& name); void add_entry(const std::string& name);
void finish_entry();
inline Zipper& operator<<(const std::string& content) { // Writing data to the archive works like with standard streams. The target
std::copy(content.begin(), content.end(), std::back_inserter(m_data)); // within the zip file is the entry created with the add_entry method.
// Template taking only arithmetic values, that std::to_string can handle.
template<class T> inline
typename std::enable_if<std::is_arithmetic<T>::value, Zipper&>::type
operator<<(T &&val) {
return this->operator<<(std::to_string(std::forward<T>(val)));
}
// Template applied only for types that std::string can handle for append
// and copy. This includes c style strings...
template<class T> inline
typename std::enable_if<!std::is_arithmetic<T>::value, Zipper&>::type
operator<<(T &&val) {
if(m_data.empty()) m_data = std::forward<T>(val);
else m_data.append(val);
return *this; return *this;
} }
/// Finishing an entry means that subsequent writes will no longer be
/// appended to the previous entry.
void finish_entry();
/// Gets the name of the archive without the path or extension.
std::string get_name() const; std::string get_name() const;
}; };
} }
#endif // ZIPPER_HPP #endif // ZIPPER_HPP