From 6e4a5682b3bc30d386b8d20fbcfc9d8c99621189 Mon Sep 17 00:00:00 2001 From: Gang Wu Date: Thu, 19 Dec 2024 15:53:19 +0800 Subject: [PATCH] AVRO-4100: [C++] Remove boost::noncopyable and boost::any (#3267) * AVRO-4100: [C++] Remove boost::noncopyable and boost::any * use stddef.h --- lang/c++/examples/imaginary.hh | 1 - lang/c++/impl/Resolver.cc | 6 +++++- lang/c++/impl/json/JsonIO.hh | 5 ++++- lang/c++/impl/parsing/ValidatingCodec.cc | 1 - lang/c++/include/avro/DataFile.hh | 20 +++++++++++++++---- lang/c++/include/avro/Generic.hh | 10 ++++++++-- lang/c++/include/avro/Layout.hh | 8 ++++++-- lang/c++/include/avro/Node.hh | 6 ++++-- lang/c++/include/avro/Parser.hh | 5 ++++- lang/c++/include/avro/Reader.hh | 6 ++++-- lang/c++/include/avro/Resolver.hh | 7 +++++-- lang/c++/include/avro/ResolverSchema.hh | 1 - lang/c++/include/avro/ResolvingReader.hh | 5 +++-- lang/c++/include/avro/Serializer.hh | 6 ++++-- lang/c++/include/avro/Stream.hh | 10 ++++++++-- lang/c++/include/avro/Validator.hh | 11 +++++++--- lang/c++/include/avro/Writer.hh | 6 ++++-- lang/c++/include/avro/buffer/BufferReader.hh | 5 ++++- .../avro/buffer/detail/BufferDetail.hh | 2 +- 19 files changed, 88 insertions(+), 33 deletions(-) diff --git a/lang/c++/examples/imaginary.hh b/lang/c++/examples/imaginary.hh index a268ea1c835..e483c0beb4a 100644 --- a/lang/c++/examples/imaginary.hh +++ b/lang/c++/examples/imaginary.hh @@ -22,7 +22,6 @@ #include "avro/Decoder.hh" #include "avro/Encoder.hh" #include "avro/Specific.hh" -#include "boost/any.hpp" namespace i { struct cpx { diff --git a/lang/c++/impl/Resolver.cc b/lang/c++/impl/Resolver.cc index 5fdd551a317..b7a57197bec 100644 --- a/lang/c++/impl/Resolver.cc +++ b/lang/c++/impl/Resolver.cc @@ -445,7 +445,7 @@ class FixedParser : public Resolver { size_t offset_; }; -class ResolverFactory : private boost::noncopyable { +class ResolverFactory { template unique_ptr @@ -512,6 +512,10 @@ class ResolverFactory : private boost::noncopyable { } public: + ResolverFactory() = default; + ResolverFactory(const ResolverFactory &) = delete; + ResolverFactory &operator=(const ResolverFactory &) = delete; + unique_ptr construct(const NodePtr &writer, const NodePtr &reader, const Layout &offset) { diff --git a/lang/c++/impl/json/JsonIO.hh b/lang/c++/impl/json/JsonIO.hh index 203bf895fd5..499255c575f 100644 --- a/lang/c++/impl/json/JsonIO.hh +++ b/lang/c++/impl/json/JsonIO.hh @@ -37,7 +37,7 @@ inline char toHex(unsigned int n) { return static_cast((n < 10) ? (n + '0') : (n + 'a' - 10)); } -class AVRO_DECL JsonParser : boost::noncopyable { +class AVRO_DECL JsonParser { public: enum class Token { Null, @@ -89,6 +89,9 @@ public: JsonParser() : curState(stValue), hasNext(false), nextChar(0), peeked(false), curToken(Token::Null), bv(false), lv(0), dv(0), line_(1) {} + JsonParser(const JsonParser &) = delete; + JsonParser &operator=(const JsonParser &) = delete; + void init(InputStream &is) { // Clear by swapping with an empty stack std::stack().swap(stateStack); diff --git a/lang/c++/impl/parsing/ValidatingCodec.cc b/lang/c++/impl/parsing/ValidatingCodec.cc index 7a1f8d91bc8..9ec1f040600 100644 --- a/lang/c++/impl/parsing/ValidatingCodec.cc +++ b/lang/c++/impl/parsing/ValidatingCodec.cc @@ -19,7 +19,6 @@ #include "ValidatingCodec.hh" #include -#include #include #include #include diff --git a/lang/c++/include/avro/DataFile.hh b/lang/c++/include/avro/DataFile.hh index 94a1dab8e31..09592b7eea3 100644 --- a/lang/c++/include/avro/DataFile.hh +++ b/lang/c++/include/avro/DataFile.hh @@ -58,7 +58,7 @@ typedef std::array DataFileSync; * At any given point in time, at most one file can be written using * this object. */ -class AVRO_DECL DataFileWriterBase : boost::noncopyable { +class AVRO_DECL DataFileWriterBase { const std::string filename_; const ValidSchema schema_; const EncoderPtr encoderPtr_; @@ -122,6 +122,9 @@ public: DataFileWriterBase(std::unique_ptr outputStream, const ValidSchema &schema, size_t syncInterval, Codec codec); + DataFileWriterBase(const DataFileWriterBase &) = delete; + DataFileWriterBase &operator=(const DataFileWriterBase &) = delete; + ~DataFileWriterBase(); /** * Closes the current file. Once closed this datafile object cannot be @@ -144,7 +147,7 @@ public: * An Avro datafile that can store objects of type T. */ template -class DataFileWriter : boost::noncopyable { +class DataFileWriter { std::unique_ptr base_; public: @@ -157,6 +160,9 @@ public: DataFileWriter(std::unique_ptr outputStream, const ValidSchema &schema, size_t syncInterval = 16 * 1024, Codec codec = NULL_CODEC) : base_(new DataFileWriterBase(std::move(outputStream), schema, syncInterval, codec)) {} + DataFileWriter(const DataFileWriter &) = delete; + DataFileWriter &operator=(const DataFileWriter &) = delete; + /** * Writes the given piece of data into the file. */ @@ -191,7 +197,7 @@ public: /** * The type independent portion of reader. */ -class AVRO_DECL DataFileReaderBase : boost::noncopyable { +class AVRO_DECL DataFileReaderBase { const std::string filename_; const std::unique_ptr stream_; const DecoderPtr decoder_; @@ -245,6 +251,9 @@ public: explicit DataFileReaderBase(std::unique_ptr inputStream); + DataFileReaderBase(const DataFileReaderBase &) = delete; + DataFileReaderBase &operator=(const DataFileReaderBase &) = delete; + /** * Initializes the reader so that the reader and writer schemas * are the same. @@ -303,7 +312,7 @@ public: * Reads the contents of data file one after another. */ template -class DataFileReader : boost::noncopyable { +class DataFileReader { std::unique_ptr base_; public: @@ -358,6 +367,9 @@ public: base_->init(readerSchema); } + DataFileReader(const DataFileReader &) = delete; + DataFileReader &operator=(const DataFileReader &) = delete; + /** * Reads the next entry from the data file. * \return true if an object has been successfully read into \p datum and diff --git a/lang/c++/include/avro/Generic.hh b/lang/c++/include/avro/Generic.hh index f35e8cf6896..ad8a73c7e67 100644 --- a/lang/c++/include/avro/Generic.hh +++ b/lang/c++/include/avro/Generic.hh @@ -31,7 +31,7 @@ namespace avro { /** * A utility class to read generic datum from decoders. */ -class AVRO_DECL GenericReader : boost::noncopyable { +class AVRO_DECL GenericReader { const ValidSchema schema_; const bool isResolving_; const DecoderPtr decoder_; @@ -52,6 +52,9 @@ public: GenericReader(const ValidSchema &writerSchema, const ValidSchema &readerSchema, const DecoderPtr &decoder); + GenericReader(const GenericReader &) = delete; + GenericReader &operator=(const GenericReader &) = delete; + /** * Reads a value off the decoder. */ @@ -79,7 +82,7 @@ public: /** * A utility class to write generic datum to encoders. */ -class AVRO_DECL GenericWriter : boost::noncopyable { +class AVRO_DECL GenericWriter { const ValidSchema schema_; const EncoderPtr encoder_; @@ -91,6 +94,9 @@ public: */ GenericWriter(ValidSchema s, EncoderPtr encoder); + GenericWriter(const GenericWriter &) = delete; + GenericWriter &operator=(const GenericWriter &) = delete; + /** * Writes a value onto the encoder. */ diff --git a/lang/c++/include/avro/Layout.hh b/lang/c++/include/avro/Layout.hh index 56d2c1d9c74..cbc05df4a6d 100644 --- a/lang/c++/include/avro/Layout.hh +++ b/lang/c++/include/avro/Layout.hh @@ -20,17 +20,21 @@ #define avro_Layout_hh__ #include "Config.hh" -#include + +#include /// \file Layout.hh /// namespace avro { -class AVRO_DECL Layout : private boost::noncopyable { +class AVRO_DECL Layout { protected: explicit Layout(size_t offset = 0) : offset_(offset) {} + Layout(const Layout &) = delete; + Layout &operator=(const Layout &) = delete; + public: size_t offset() const { return offset_; diff --git a/lang/c++/include/avro/Node.hh b/lang/c++/include/avro/Node.hh index e1a8e660f4d..8664a9ab630 100644 --- a/lang/c++/include/avro/Node.hh +++ b/lang/c++/include/avro/Node.hh @@ -21,7 +21,6 @@ #include "Config.hh" -#include #include #include #include @@ -97,12 +96,15 @@ inline std::ostream &operator<<(std::ostream &os, const Name &n) { /// different node types. /// -class AVRO_DECL Node : private boost::noncopyable { +class AVRO_DECL Node { public: explicit Node(Type type) : type_(type), logicalType_(LogicalType::NONE), locked_(false) {} + Node(const Node &) = delete; + Node &operator=(const Node &) = delete; + virtual ~Node(); Type type() const { diff --git a/lang/c++/include/avro/Parser.hh b/lang/c++/include/avro/Parser.hh index f6bc74874cc..3a6c3f137e0 100644 --- a/lang/c++/include/avro/Parser.hh +++ b/lang/c++/include/avro/Parser.hh @@ -32,7 +32,7 @@ namespace avro { /// template -class Parser : private boost::noncopyable { +class Parser { public: // Constructor only works with Writer @@ -41,6 +41,9 @@ public: /// Constructor only works with ValidatingWriter Parser(const ValidSchema &schema, const InputBuffer &in) : reader_(schema, in) {} + Parser(const Parser &) = delete; + Parser &operator=(const Parser &) = delete; + void readNull() { Null null; reader_.readValue(null); diff --git a/lang/c++/include/avro/Reader.hh b/lang/c++/include/avro/Reader.hh index 62d81c2365f..604527c0129 100644 --- a/lang/c++/include/avro/Reader.hh +++ b/lang/c++/include/avro/Reader.hh @@ -20,7 +20,6 @@ #define avro_Reader_hh__ #include -#include #include #include @@ -38,7 +37,7 @@ namespace avro { /// template -class ReaderImpl : private boost::noncopyable { +class ReaderImpl { public: explicit ReaderImpl(const InputBuffer &buffer) : reader_(buffer) {} @@ -46,6 +45,9 @@ public: ReaderImpl(const ValidSchema &schema, const InputBuffer &buffer) : validator_(schema), reader_(buffer) {} + ReaderImpl(const ReaderImpl &) = delete; + ReaderImpl &operator=(const ReaderImpl &) = delete; + void readValue(Null &) { validator_.checkTypeExpected(AVRO_NULL); } diff --git a/lang/c++/include/avro/Resolver.hh b/lang/c++/include/avro/Resolver.hh index 06c33e76c68..e1fc00d296a 100644 --- a/lang/c++/include/avro/Resolver.hh +++ b/lang/c++/include/avro/Resolver.hh @@ -19,7 +19,6 @@ #ifndef avro_Resolver_hh__ #define avro_Resolver_hh__ -#include #include #include @@ -34,8 +33,12 @@ namespace avro { class ValidSchema; class Layout; -class AVRO_DECL Resolver : private boost::noncopyable { +class AVRO_DECL Resolver { public: + Resolver() = default; + Resolver(const Resolver &) = delete; + Resolver &operator=(const Resolver &) = delete; + virtual void parse(Reader &reader, uint8_t *address) const = 0; virtual ~Resolver() = default; }; diff --git a/lang/c++/include/avro/ResolverSchema.hh b/lang/c++/include/avro/ResolverSchema.hh index d641d08f8c9..25c113fbe6f 100644 --- a/lang/c++/include/avro/ResolverSchema.hh +++ b/lang/c++/include/avro/ResolverSchema.hh @@ -19,7 +19,6 @@ #ifndef avro_ResolverSchema_hh__ #define avro_ResolverSchema_hh__ -#include #include #include diff --git a/lang/c++/include/avro/ResolvingReader.hh b/lang/c++/include/avro/ResolvingReader.hh index c7aed39743c..5ced210dbad 100644 --- a/lang/c++/include/avro/ResolvingReader.hh +++ b/lang/c++/include/avro/ResolvingReader.hh @@ -19,7 +19,6 @@ #ifndef avro_ResolvingReader_hh__ #define avro_ResolvingReader_hh__ -#include #include #include "Config.hh" @@ -28,11 +27,13 @@ namespace avro { -class AVRO_DECL ResolvingReader : private boost::noncopyable { +class AVRO_DECL ResolvingReader { public: ResolvingReader(const ResolverSchema &schema, const InputBuffer &in) : reader_(in), schema_(schema) {} + ResolvingReader(const ResolvingReader &) = delete; + ResolvingReader &operator=(const ResolvingReader &) = delete; template void parse(T &object) { diff --git a/lang/c++/include/avro/Serializer.hh b/lang/c++/include/avro/Serializer.hh index 1a2c8e029f9..484a477ca93 100644 --- a/lang/c++/include/avro/Serializer.hh +++ b/lang/c++/include/avro/Serializer.hh @@ -20,7 +20,6 @@ #define avro_Serializer_hh__ #include -#include #include "Config.hh" #include "Writer.hh" @@ -31,7 +30,7 @@ namespace avro { /// explicit write* names instead of writeValue template -class Serializer : private boost::noncopyable { +class Serializer { public: /// Constructor only works with Writer @@ -40,6 +39,9 @@ public: /// Constructor only works with ValidatingWriter explicit Serializer(const ValidSchema &schema) : writer_(schema) {} + Serializer(const Serializer &) = delete; + Serializer &operator=(const Serializer &) = delete; + void writeNull() { writer_.writeValue(Null()); } diff --git a/lang/c++/include/avro/Stream.hh b/lang/c++/include/avro/Stream.hh index 81448d26d02..783e4513cdf 100644 --- a/lang/c++/include/avro/Stream.hh +++ b/lang/c++/include/avro/Stream.hh @@ -34,13 +34,16 @@ namespace avro { /** * A no-copy input stream. */ -class AVRO_DECL InputStream : boost::noncopyable { +class AVRO_DECL InputStream { protected: /** * An empty constructor. */ InputStream() = default; + InputStream(const InputStream &) = delete; + InputStream &operator=(const InputStream &) = delete; + public: /** * Destructor. @@ -106,13 +109,16 @@ typedef std::unique_ptr SeekableInputStreamPtr; /** * A no-copy output stream. */ -class AVRO_DECL OutputStream : boost::noncopyable { +class AVRO_DECL OutputStream { protected: /** * An empty constructor. */ OutputStream() = default; + OutputStream(const OutputStream &) = delete; + OutputStream &operator=(const OutputStream &) = delete; + public: /** * Destructor. diff --git a/lang/c++/include/avro/Validator.hh b/lang/c++/include/avro/Validator.hh index 6437a549ff1..76b74764d80 100644 --- a/lang/c++/include/avro/Validator.hh +++ b/lang/c++/include/avro/Validator.hh @@ -19,7 +19,6 @@ #ifndef avro_Validating_hh__ #define avro_Validating_hh__ -#include #include #include #include @@ -30,11 +29,14 @@ namespace avro { -class AVRO_DECL NullValidator : private boost::noncopyable { +class AVRO_DECL NullValidator { public: explicit NullValidator(const ValidSchema &) {} NullValidator() = default; + NullValidator(const NullValidator &) = delete; + NullValidator &operator=(const NullValidator &) = delete; + void setCount(size_t) {} static bool typeIsExpected(Type) { @@ -67,10 +69,13 @@ public: /// through all leaf nodes but a union only skips to one), and reports which /// type is next. -class AVRO_DECL Validator : private boost::noncopyable { +class AVRO_DECL Validator { public: explicit Validator(ValidSchema schema); + Validator(const Validator &) = delete; + Validator &operator=(const Validator &) = delete; + void setCount(size_t val); bool typeIsExpected(Type type) const { diff --git a/lang/c++/include/avro/Writer.hh b/lang/c++/include/avro/Writer.hh index 930ea398c44..426f8ba0ed0 100644 --- a/lang/c++/include/avro/Writer.hh +++ b/lang/c++/include/avro/Writer.hh @@ -20,7 +20,6 @@ #define avro_Writer_hh__ #include -#include #include "Config.hh" #include "Types.hh" @@ -33,13 +32,16 @@ namespace avro { /// Class for writing avro data to a stream. template -class WriterImpl : private boost::noncopyable { +class WriterImpl { public: WriterImpl() = default; explicit WriterImpl(const ValidSchema &schema) : validator_(schema) {} + WriterImpl(const WriterImpl &) = delete; + WriterImpl &operator=(const WriterImpl &) = delete; + void writeValue(const Null &) { validator_.checkTypeExpected(AVRO_NULL); } diff --git a/lang/c++/include/avro/buffer/BufferReader.hh b/lang/c++/include/avro/buffer/BufferReader.hh index 7f49518e64b..39b23fa7084 100644 --- a/lang/c++/include/avro/buffer/BufferReader.hh +++ b/lang/c++/include/avro/buffer/BufferReader.hh @@ -40,7 +40,7 @@ namespace avro { * chunk boundaries. May read from an InputBuffer or OutputBuffer. * **/ -class AVRO_DECL BufferReader : private boost::noncopyable { +class AVRO_DECL BufferReader { public: typedef detail::data_type data_type; @@ -83,6 +83,9 @@ public: bytesRemaining_(bytes_), chunkPos_(0) {} + BufferReader(const BufferReader &) = delete; + BufferReader &operator=(const BufferReader &) = delete; + /** * How many bytes are still not read from this buffer. **/ diff --git a/lang/c++/include/avro/buffer/detail/BufferDetail.hh b/lang/c++/include/avro/buffer/detail/BufferDetail.hh index 652e98d51ba..697c8f41c21 100644 --- a/lang/c++/include/avro/buffer/detail/BufferDetail.hh +++ b/lang/c++/include/avro/buffer/detail/BufferDetail.hh @@ -191,7 +191,7 @@ inline bool operator!=(const Chunk &lhs, const Chunk &rhs) { * */ -class BufferImpl : boost::noncopyable { +class BufferImpl { /// Add a new chunk to the list of chunks for this buffer, growing the /// buffer by the default block size.