- Moment *m1 = SMOB_TO_TYPE(Moment, a);
- Moment *m2 = SMOB_TO_TYPE(Moment, b);
-
- return (*m1 == *m2) ? SCM_BOOL_T : SCM_BOOL_F;
+ main_part_ *= src.main_part_;
+ grace_part_ *= src.main_part_;
+}
+
+/* Only take the main part of SRC for division. */
+void
+Moment::operator /= (Moment const &src)
+{
+ main_part_ /= src.main_part_;
+ grace_part_ /= src.main_part_;
+}
+
+/* Only take the main part of SRC for division. */
+void
+Moment::operator %= (Moment const &src)
+{
+ 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;