Style Fixes

(1) A few classes should be made non-copyable
(2) C++11 semantics should be preferred to mark classes non-copyable
(3) Added explicit to several contructors in oder to prevent implicit conversions
This commit is contained in:
Martin 2015-09-16 15:19:52 +02:00
parent d62b2541d7
commit baf4f6657a

View File

@ -240,7 +240,7 @@ namespace pugi
typedef It const_iterator; typedef It const_iterator;
typedef It iterator; typedef It iterator;
xml_object_range(It b, It e): _begin(b), _end(e) explicit xml_object_range(It b, It e): _begin(b), _end(e)
{ {
} }
@ -264,9 +264,18 @@ namespace pugi
// xml_writer implementation for FILE* // xml_writer implementation for FILE*
class PUGIXML_CLASS xml_writer_file: public xml_writer class PUGIXML_CLASS xml_writer_file: public xml_writer
{ {
// Non-copyable semantics
#if __cplusplus >= 201103
xml_writer_file(const xml_writer_file&) = delete;
xml_writer_file& operator=(const xml_writer_file) = delete;
#else
xml_writer_file(const xml_writer_file&);
xml_writer_file& operator=(const xml_writer_file);
#endif
public: public:
// Construct writer from a FILE* object; void* is used to avoid header dependencies on stdio // Construct writer from a FILE* object; void* is used to avoid header dependencies on stdio
xml_writer_file(void* file); explicit xml_writer_file(void* file);
virtual void write(const void* data, size_t size); virtual void write(const void* data, size_t size);
@ -278,10 +287,19 @@ namespace pugi
// xml_writer implementation for streams // xml_writer implementation for streams
class PUGIXML_CLASS xml_writer_stream: public xml_writer class PUGIXML_CLASS xml_writer_stream: public xml_writer
{ {
// Non-copyable semantics
#if __cplusplus >= 201103
xml_writer_stream(const xml_writer_stream&) = delete;
xml_writer_stream& operator=(const xml_writer_stream) = delete;
#else
xml_writer_stream(const xml_writer_stream&);
xml_writer_stream& operator=(const xml_writer_stream);
#endif
public: public:
// Construct writer from an output stream object // Construct writer from an output stream object
xml_writer_stream(std::basic_ostream<char, std::char_traits<char> >& stream); explicit xml_writer_stream(std::basic_ostream<char, std::char_traits<char> >& stream);
xml_writer_stream(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream); explicit xml_writer_stream(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& stream);
virtual void write(const void* data, size_t size); virtual void write(const void* data, size_t size);
@ -759,7 +777,7 @@ namespace pugi
xml_node_iterator(); xml_node_iterator();
// Construct an iterator which points to the specified node // Construct an iterator which points to the specified node
xml_node_iterator(const xml_node& node); explicit xml_node_iterator(const xml_node& node);
// Iterator operators // Iterator operators
bool operator==(const xml_node_iterator& rhs) const; bool operator==(const xml_node_iterator& rhs) const;
@ -784,7 +802,7 @@ namespace pugi
mutable xml_attribute _wrap; mutable xml_attribute _wrap;
xml_node _parent; xml_node _parent;
xml_attribute_iterator(xml_attribute_struct* ref, xml_node_struct* parent); explicit xml_attribute_iterator(xml_attribute_struct* ref, xml_node_struct* parent);
public: public:
// Iterator traits // Iterator traits
@ -801,7 +819,7 @@ namespace pugi
xml_attribute_iterator(); xml_attribute_iterator();
// Construct an iterator which points to the specified attribute // Construct an iterator which points to the specified attribute
xml_attribute_iterator(const xml_attribute& attr, const xml_node& parent); explicit xml_attribute_iterator(const xml_attribute& attr, const xml_node& parent);
// Iterator operators // Iterator operators
bool operator==(const xml_attribute_iterator& rhs) const; bool operator==(const xml_attribute_iterator& rhs) const;
@ -837,7 +855,7 @@ namespace pugi
xml_named_node_iterator(); xml_named_node_iterator();
// Construct an iterator which points to the specified node // Construct an iterator which points to the specified node
xml_named_node_iterator(const xml_node& node, const char_t* name); explicit xml_named_node_iterator(const xml_node& node, const char_t* name);
// Iterator operators // Iterator operators
bool operator==(const xml_named_node_iterator& rhs) const; bool operator==(const xml_named_node_iterator& rhs) const;
@ -938,15 +956,19 @@ namespace pugi
// Document class (DOM tree root) // Document class (DOM tree root)
class PUGIXML_CLASS xml_document: public xml_node class PUGIXML_CLASS xml_document: public xml_node
{ {
private:
char_t* _buffer;
char _memory[192];
// Non-copyable semantics // Non-copyable semantics
#if __cplusplus >= 201103
xml_document(const xml_document&) = delete;
const xml_document& operator=(const xml_document&) = delete;
#else
xml_document(const xml_document&); xml_document(const xml_document&);
const xml_document& operator=(const xml_document&); const xml_document& operator=(const xml_document&);
#endif
private:
char_t* _buffer;
char _memory[192];
void create(); void create();
void destroy(); void destroy();
@ -1040,18 +1062,22 @@ namespace pugi
// A single XPath variable // A single XPath variable
class PUGIXML_CLASS xpath_variable class PUGIXML_CLASS xpath_variable
{ {
// Non-copyable semantics
#if __cplusplus >= 201103
xpath_variable(const xpath_variable&) = delete;
xpath_variable& operator=(const xpath_variable&) = delete;
#else
xpath_variable(const xpath_variable&);
xpath_variable& operator=(const xpath_variable&);
#endif
friend class xpath_variable_set; friend class xpath_variable_set;
protected: protected:
xpath_value_type _type; xpath_value_type _type;
xpath_variable* _next; xpath_variable* _next;
xpath_variable(xpath_value_type type); explicit xpath_variable(xpath_value_type type);
// Non-copyable semantics
xpath_variable(const xpath_variable&);
xpath_variable& operator=(const xpath_variable&);
public: public:
// Get variable name // Get variable name
const char_t* name() const; const char_t* name() const;
@ -1118,16 +1144,21 @@ namespace pugi
// A compiled XPath query object // A compiled XPath query object
class PUGIXML_CLASS xpath_query class PUGIXML_CLASS xpath_query
{ {
// Non-copyable semantics
#if __cplusplus >= 201103
xpath_query(const xpath_query&) = delete;
xpath_query& operator=(const xpath_query&) = delete;
#else
xpath_query(const xpath_query&);
xpath_query& operator=(const xpath_query&);
#endif
private: private:
void* _impl; void* _impl;
xpath_parse_result _result; xpath_parse_result _result;
typedef void (*unspecified_bool_type)(xpath_query***); typedef void (*unspecified_bool_type)(xpath_query***);
// Non-copyable semantics
xpath_query(const xpath_query&);
xpath_query& operator=(const xpath_query&);
public: public:
// Construct a compiled object from XPath expression. // Construct a compiled object from XPath expression.
// If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on compilation errors. // If PUGIXML_NO_EXCEPTIONS is not defined, throws xpath_exception on compilation errors.
@ -1188,7 +1219,7 @@ namespace pugi
// Borland C++ workaround // Borland C++ workaround
bool operator!() const; bool operator!() const;
}; };
#ifndef PUGIXML_NO_EXCEPTIONS #ifndef PUGIXML_NO_EXCEPTIONS
// XPath exception class // XPath exception class
class PUGIXML_CLASS xpath_exception: public std::exception class PUGIXML_CLASS xpath_exception: public std::exception
@ -1207,34 +1238,34 @@ namespace pugi
const xpath_parse_result& result() const; const xpath_parse_result& result() const;
}; };
#endif #endif
// XPath node class (either xml_node or xml_attribute) // XPath node class (either xml_node or xml_attribute)
class PUGIXML_CLASS xpath_node class PUGIXML_CLASS xpath_node
{ {
private: private:
xml_node _node; xml_node _node;
xml_attribute _attribute; xml_attribute _attribute;
typedef void (*unspecified_bool_type)(xpath_node***); typedef void (*unspecified_bool_type)(xpath_node***);
public: public:
// Default constructor; constructs empty XPath node // Default constructor; constructs empty XPath node
xpath_node(); xpath_node();
// Construct XPath node from XML node/attribute // Construct XPath node from XML node/attribute
xpath_node(const xml_node& node); xpath_node(const xml_node& node);
xpath_node(const xml_attribute& attribute, const xml_node& parent); explicit xpath_node(const xml_attribute& attribute, const xml_node& parent);
// Get node/attribute, if any // Get node/attribute, if any
xml_node node() const; xml_node node() const;
xml_attribute attribute() const; xml_attribute attribute() const;
// Get parent of contained node/attribute // Get parent of contained node/attribute
xml_node parent() const; xml_node parent() const;
// Safe bool conversion operator // Safe bool conversion operator
operator unspecified_bool_type() const; operator unspecified_bool_type() const;
// Borland C++ workaround // Borland C++ workaround
bool operator!() const; bool operator!() const;
@ -1260,22 +1291,22 @@ namespace pugi
type_sorted, // Sorted by document order (ascending) type_sorted, // Sorted by document order (ascending)
type_sorted_reverse // Sorted by document order (descending) type_sorted_reverse // Sorted by document order (descending)
}; };
// Constant iterator type // Constant iterator type
typedef const xpath_node* const_iterator; typedef const xpath_node* const_iterator;
// We define non-constant iterator to be the same as constant iterator so that various generic algorithms (i.e. boost foreach) work // We define non-constant iterator to be the same as constant iterator so that various generic algorithms (i.e. boost foreach) work
typedef const xpath_node* iterator; typedef const xpath_node* iterator;
// Default constructor. Constructs empty set. // Default constructor. Constructs empty set.
xpath_node_set(); xpath_node_set();
// Constructs a set from iterator range; data is not checked for duplicates and is not sorted according to provided type, so be careful // Constructs a set from iterator range; data is not checked for duplicates and is not sorted according to provided type, so be careful
xpath_node_set(const_iterator begin, const_iterator end, type_t type = type_unsorted); explicit xpath_node_set(const_iterator begin, const_iterator end, type_t type = type_unsorted);
// Destructor // Destructor
~xpath_node_set(); ~xpath_node_set();
// Copy constructor/assignment operator // Copy constructor/assignment operator
xpath_node_set(const xpath_node_set& ns); xpath_node_set(const xpath_node_set& ns);
xpath_node_set& operator=(const xpath_node_set& ns); xpath_node_set& operator=(const xpath_node_set& ns);
@ -1288,13 +1319,13 @@ namespace pugi
// Get collection type // Get collection type
type_t type() const; type_t type() const;
// Get collection size // Get collection size
size_t size() const; size_t size() const;
// Indexing operator // Indexing operator
const xpath_node& operator[](size_t index) const; const xpath_node& operator[](size_t index) const;
// Collection iterators // Collection iterators
const_iterator begin() const; const_iterator begin() const;
const_iterator end() const; const_iterator end() const;
@ -1307,12 +1338,12 @@ namespace pugi
// Check if collection is empty // Check if collection is empty
bool empty() const; bool empty() const;
private: private:
type_t _type; type_t _type;
xpath_node _storage; xpath_node _storage;
xpath_node* _begin; xpath_node* _begin;
xpath_node* _end; xpath_node* _end;
@ -1325,7 +1356,7 @@ namespace pugi
// Convert wide string to UTF8 // Convert wide string to UTF8
std::basic_string<char, std::char_traits<char>, std::allocator<char> > PUGIXML_FUNCTION as_utf8(const wchar_t* str); std::basic_string<char, std::char_traits<char>, std::allocator<char> > PUGIXML_FUNCTION as_utf8(const wchar_t* str);
std::basic_string<char, std::char_traits<char>, std::allocator<char> > PUGIXML_FUNCTION as_utf8(const std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >& str); std::basic_string<char, std::char_traits<char>, std::allocator<char> > PUGIXML_FUNCTION as_utf8(const std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >& str);
// Convert UTF8 to wide string // Convert UTF8 to wide string
std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > PUGIXML_FUNCTION as_wide(const char* str); std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > PUGIXML_FUNCTION as_wide(const char* str);
std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > PUGIXML_FUNCTION as_wide(const std::basic_string<char, std::char_traits<char>, std::allocator<char> >& str); std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > PUGIXML_FUNCTION as_wide(const std::basic_string<char, std::char_traits<char>, std::allocator<char> >& str);
@ -1333,7 +1364,7 @@ namespace pugi
// Memory allocation function interface; returns pointer to allocated memory or NULL on failure // Memory allocation function interface; returns pointer to allocated memory or NULL on failure
typedef void* (*allocation_function)(size_t size); typedef void* (*allocation_function)(size_t size);
// Memory deallocation function interface // Memory deallocation function interface
typedef void (*deallocation_function)(void* ptr); typedef void (*deallocation_function)(void* ptr);