+extern bool operator== (Fraction const & a, Fraction const & b);
+extern bool operator!= (Fraction const & a, Fraction const & b);
+extern std::ostream& operator<< (std::ostream& s, Fraction const & f);
+
+/** @struct EqualityOptions
+ * @brief A class to describe what "equality" means for a particular test.
+ *
+ * When comparing things, we want to be able to ignore some differences;
+ * this class expresses those differences.
+ */
+struct EqualityOptions
+{
+ /** Construct an EqualityOptions where nothing at all can differ */
+ EqualityOptions ()
+ : max_mean_pixel_error (0)
+ , max_std_dev_pixel_error (0)
+ , max_audio_sample_error (0)
+ , cpl_annotation_texts_can_differ (false)
+ , reel_annotation_texts_can_differ (false)
+ , reel_hashes_can_differ (false)
+ , issue_dates_can_differ (false)
+ , keep_going (false)
+ {}
+
+ /** The maximum allowable mean difference in pixel value between two images */
+ double max_mean_pixel_error;
+ /** The maximum standard deviation of the differences in pixel value between two images */
+ double max_std_dev_pixel_error;
+ /** The maximum difference in audio sample value between two soundtracks */
+ int max_audio_sample_error;
+ /** true if the <AnnotationText> nodes of CPLs are allowed to differ */
+ bool cpl_annotation_texts_can_differ;
+ /** true if the <AnnotationText> nodes of Reels are allowed to differ */
+ bool reel_annotation_texts_can_differ;
+ /** true if <Hash>es in Reels can differ */
+ bool reel_hashes_can_differ;
+ /** true if IssueDate nodes can differ */
+ bool issue_dates_can_differ;
+ bool keep_going;