- Moment *m1 = unsmob_moment (a);
- Moment *m2 = unsmob_moment (b);
-
- return (*m1 == *m2) ? SCM_BOOL_T : SCM_BOOL_F;
+ main_part_ %= src.main_part_;
+ grace_part_ %= src.main_part_;
+}
+
+I64
+Moment::den () const
+{
+ /* TODO: ensure MSB == 0 here */
+ return main_part_.den ();
+}
+
+I64
+Moment::num () const
+{
+ return main_part_.num ();
+}
+
+bool
+Moment::to_bool () const
+{
+ return main_part_ || grace_part_;
+}
+
+void
+Moment::set_infinite (int k)
+{
+ main_part_.set_infinite (k);
+}
+
+string
+Moment::to_string () const
+{
+ string s = main_part_.to_string ();
+ if (grace_part_)
+ s += "G" + grace_part_.to_string ();
+ return s;
+}
+
+Moment
+Moment::operator - () const
+{
+ Moment m;
+ m.grace_part_ = -grace_part_;
+ m.main_part_ = -main_part_;
+ return m;
+}
+
+#ifdef STREAM_SUPPORT
+ostream &
+operator << (ostream &os, Moment const &m)
+{
+ os << m.to_string ();
+ return os;
+}
+#endif
+
+Moment
+robust_scm2moment (SCM m, Moment d)
+{
+ Moment *p = unsmob_moment (m);
+ if (!p)
+ return d;
+ else
+ return *p;
+}
+
+bool
+moment_less (SCM a, SCM b)
+{
+ return *unsmob_moment (a) < *unsmob_moment (b);