massive glob of checkins: improved tests, more tests, bugfixes
diff --git a/include/FLAC++/metadata.h b/include/FLAC++/metadata.h
index 7e0cbbd..fa74188 100644
--- a/include/FLAC++/metadata.h
+++ b/include/FLAC++/metadata.h
@@ -47,21 +47,28 @@
 		class Prototype {
 		protected:
 			Prototype(::FLAC__StreamMetaData *object, bool copy);
-			virtual ~Prototype();
 
 			void operator=(const Prototype &);
 			void operator=(const ::FLAC__StreamMetaData &);
 			void operator=(const ::FLAC__StreamMetaData *);
 
+			inline bool operator==(const Prototype &) const;
+			inline bool operator==(const ::FLAC__StreamMetaData &) const;
+			inline bool operator==(const ::FLAC__StreamMetaData *) const;
+			inline bool operator!=(const Prototype &) const;
+			inline bool operator!=(const ::FLAC__StreamMetaData &) const;
+			inline bool operator!=(const ::FLAC__StreamMetaData *) const;
+
 			virtual void clear();
 
 			::FLAC__StreamMetaData *object_;
 		public:
+			virtual ~Prototype();
+
 			friend class SimpleIterator;
 			friend class Iterator;
 
-			inline bool is_valid() const { return 0 != object_; }
-			inline operator bool() const { return is_valid(); }
+			inline bool is_valid() const;
 
 			bool get_is_last() const;
 			FLAC__MetaDataType get_type() const;
@@ -74,6 +81,28 @@
 			inline void set_reference(bool x) { is_reference_ = x; }
 		};
 
+		inline bool Prototype::operator==(const Prototype &object) const 
+		{ return ::FLAC__metadata_object_is_equal(object_, object.object_); }
+
+		inline bool Prototype::operator==(const ::FLAC__StreamMetaData &object) const 
+		{ return ::FLAC__metadata_object_is_equal(object_, &object); }
+
+		inline bool Prototype::operator==(const ::FLAC__StreamMetaData *object) const 
+		{ return ::FLAC__metadata_object_is_equal(object_, object); }
+
+		inline bool Prototype::operator!=(const Prototype &object) const 
+		{ return !operator==(object); }
+
+		inline bool Prototype::operator!=(const ::FLAC__StreamMetaData &object) const 
+		{ return !operator==(object); }
+
+		inline bool Prototype::operator!=(const ::FLAC__StreamMetaData *object) const 
+		{ return !operator==(object); }
+
+		inline bool Prototype::is_valid() const
+		{ return 0 != object_; }
+
+
 		class StreamInfo : public Prototype {
 		public:
 			StreamInfo();
@@ -84,6 +113,13 @@
 			inline void operator=(const ::FLAC__StreamMetaData &object) { Prototype::operator=(object); }
 			inline void operator=(const ::FLAC__StreamMetaData *object) { Prototype::operator=(object); }
 
+			inline bool operator==(const StreamInfo &object) const { return Prototype::operator==(object); }
+			inline bool operator==(const ::FLAC__StreamMetaData &object) const { return Prototype::operator==(object); }
+			inline bool operator==(const ::FLAC__StreamMetaData *object) const { return Prototype::operator==(object); }
+			inline bool operator!=(const StreamInfo &object) const { return Prototype::operator!=(object); }
+			inline bool operator!=(const ::FLAC__StreamMetaData &object) const { return Prototype::operator==(object); }
+			inline bool operator!=(const ::FLAC__StreamMetaData *object) const { return Prototype::operator==(object); }
+
 			unsigned get_min_blocksize() const;
 			unsigned get_max_blocksize() const;
 			unsigned get_min_framesize() const;
@@ -115,6 +151,13 @@
 			inline void operator=(const ::FLAC__StreamMetaData &object) { Prototype::operator=(object); }
 			inline void operator=(const ::FLAC__StreamMetaData *object) { Prototype::operator=(object); }
 
+			inline bool operator==(const Padding &object) const { return Prototype::operator==(object); }
+			inline bool operator==(const ::FLAC__StreamMetaData &object) const { return Prototype::operator==(object); }
+			inline bool operator==(const ::FLAC__StreamMetaData *object) const { return Prototype::operator==(object); }
+			inline bool operator!=(const Padding &object) const { return Prototype::operator!=(object); }
+			inline bool operator!=(const ::FLAC__StreamMetaData &object) const { return Prototype::operator==(object); }
+			inline bool operator!=(const ::FLAC__StreamMetaData *object) const { return Prototype::operator==(object); }
+
 			void set_length(unsigned length);
 		};
 
@@ -128,6 +171,13 @@
 			inline void operator=(const ::FLAC__StreamMetaData &object) { Prototype::operator=(object); }
 			inline void operator=(const ::FLAC__StreamMetaData *object) { Prototype::operator=(object); }
 
+			inline bool operator==(const Application &object) const { return Prototype::operator==(object); }
+			inline bool operator==(const ::FLAC__StreamMetaData &object) const { return Prototype::operator==(object); }
+			inline bool operator==(const ::FLAC__StreamMetaData *object) const { return Prototype::operator==(object); }
+			inline bool operator!=(const Application &object) const { return Prototype::operator!=(object); }
+			inline bool operator!=(const ::FLAC__StreamMetaData &object) const { return Prototype::operator==(object); }
+			inline bool operator!=(const ::FLAC__StreamMetaData *object) const { return Prototype::operator==(object); }
+
 			const FLAC__byte *get_id() const;
 			const FLAC__byte *get_data() const;
 
@@ -145,6 +195,13 @@
 			inline void operator=(const ::FLAC__StreamMetaData &object) { Prototype::operator=(object); }
 			inline void operator=(const ::FLAC__StreamMetaData *object) { Prototype::operator=(object); }
 
+			inline bool operator==(const SeekTable &object) const { return Prototype::operator==(object); }
+			inline bool operator==(const ::FLAC__StreamMetaData &object) const { return Prototype::operator==(object); }
+			inline bool operator==(const ::FLAC__StreamMetaData *object) const { return Prototype::operator==(object); }
+			inline bool operator!=(const SeekTable &object) const { return Prototype::operator!=(object); }
+			inline bool operator!=(const ::FLAC__StreamMetaData &object) const { return Prototype::operator==(object); }
+			inline bool operator!=(const ::FLAC__StreamMetaData *object) const { return Prototype::operator==(object); }
+
 			unsigned get_num_points() const;
 			::FLAC__StreamMetaData_SeekPoint get_point(unsigned index) const;
 
@@ -168,7 +225,6 @@
 				virtual ~Entry();
 
 				virtual bool is_valid() const;
-				inline operator bool() const { return is_valid(); }
 
 				unsigned get_field_length() const;
 				unsigned get_field_name_length() const;
@@ -209,6 +265,13 @@
 			inline void operator=(const ::FLAC__StreamMetaData &object) { Prototype::operator=(object); }
 			inline void operator=(const ::FLAC__StreamMetaData *object) { Prototype::operator=(object); }
 
+			inline bool operator==(const VorbisComment &object) const { return Prototype::operator==(object); }
+			inline bool operator==(const ::FLAC__StreamMetaData &object) const { return Prototype::operator==(object); }
+			inline bool operator==(const ::FLAC__StreamMetaData *object) const { return Prototype::operator==(object); }
+			inline bool operator!=(const VorbisComment &object) const { return Prototype::operator!=(object); }
+			inline bool operator!=(const ::FLAC__StreamMetaData &object) const { return Prototype::operator==(object); }
+			inline bool operator!=(const ::FLAC__StreamMetaData *object) const { return Prototype::operator==(object); }
+
 			unsigned get_num_comments() const;
 			Entry get_vendor_string() const;
 			Entry get_comment(unsigned index) const;
@@ -274,7 +337,6 @@
 			bool init(const char *filename, bool preserve_file_stats = false);
 
 			bool is_valid() const;
-			inline operator bool() const { return is_valid(); }
 			Status status();
 			bool is_writable() const;
 
@@ -347,7 +409,6 @@
 			friend class Iterator;
 
 			bool is_valid() const;
-			inline operator bool() const { return is_valid(); }
 			Status status();
 
 			bool read(const char *filename);
@@ -367,7 +428,6 @@
 			virtual ~Iterator();
 
 			bool is_valid() const;
-			inline operator bool() const { return is_valid(); }
 
 			void init(Chain *chain);