[mathicgb] 312/393: Added readBasis and writeBasis to MathicIO along with tests.

Doug Torrance dtorrance-guest at moszumanska.debian.org
Fri Apr 3 15:59:27 UTC 2015


This is an automated email from the git hooks/post-receive script.

dtorrance-guest pushed a commit to branch upstream
in repository mathicgb.

commit b400a54c7c2a7bf3d52051a6d5e8261500be813a
Author: Bjarke Hammersholt Roune <bjarkehr.code at gmail.com>
Date:   Mon May 6 17:04:01 2013 +0200

    Added readBasis and writeBasis to MathicIO along with tests.
---
 src/mathicgb/Basis.cpp    | 16 ++++++----------
 src/mathicgb/Basis.hpp    | 17 ++++++++++++-----
 src/mathicgb/MathicIO.hpp | 24 ++++++++++++++++++++----
 src/test/MathicIO.cpp     | 35 ++++++++++++++++++++++++++++++++++-
 4 files changed, 72 insertions(+), 20 deletions(-)

diff --git a/src/mathicgb/Basis.cpp b/src/mathicgb/Basis.cpp
index 7b1048e..508e16a 100755
--- a/src/mathicgb/Basis.cpp
+++ b/src/mathicgb/Basis.cpp
@@ -9,24 +9,20 @@
 #include <iostream>
 #include <cctype>
 
-Basis::~Basis()
-{
-  for (size_t i = 0; i<mGenerators.size(); i++)
-    delete mGenerators[i];
-}
-
-void Basis::insert(std::unique_ptr<Poly> p) {
+void Basis::insert(std::unique_ptr<Poly>&& p) {
   MATHICGB_ASSERT(p.get() != 0);
   MATHICGB_ASSERT(p->termsAreInDescendingOrder());
-  mGenerators.reserve(mGenerators.size() + 1);
-  mGenerators.push_back(p.release());
+  mGenerators.push_back(std::move(p));
 }
 
 namespace {
   class BasisSort {
   public:
     BasisSort(const FreeModuleOrder& order): mOrder(order) {}
-    bool operator()(const Poly* a, const Poly* b) {
+    bool operator()(
+      const std::unique_ptr<Poly>& a,
+      const std::unique_ptr<Poly>& b
+    ) {
       return mOrder.signatureCompare
         (a->getLeadMonomial(), b->getLeadMonomial()) == LT;
     }
diff --git a/src/mathicgb/Basis.hpp b/src/mathicgb/Basis.hpp
index 26eabf9..9c1b6b9 100755
--- a/src/mathicgb/Basis.hpp
+++ b/src/mathicgb/Basis.hpp
@@ -17,9 +17,9 @@ class FreeModuleOrder;
 class Basis {
 public:
   Basis(const PolyRing &R) : mRing(R) {}
-  ~Basis();
+  Basis(Basis&& basis): mRing(basis.ring()), mGenerators(std::move(basis.mGenerators)) {}
 
-  void insert(std::unique_ptr<Poly> p);
+  void insert(std::unique_ptr<Poly>&& p);
 
   /// reads ring, #gens, each generator in turn
   typedef std::tuple<
@@ -35,8 +35,13 @@ public:
   const PolyRing& ring() const { return mRing; }
 
   const PolyRing *getPolyRing() const { return &mRing; }
-  const std::vector<Poly *>& viewGenerators() { return mGenerators; }
-  const Poly *getPoly(size_t i) const { return mGenerators[i]; }
+  const std::vector<std::unique_ptr<Poly>>& viewGenerators() {
+    return mGenerators;
+  }
+  const Poly *getPoly(size_t i) const {
+    MATHICGB_ASSERT(i < size());
+    return mGenerators[i].get();
+  }
   size_t size() const {return mGenerators.size();}
   bool empty() const {return mGenerators.empty();}
   void reserve(size_t size) {mGenerators.reserve(size);}
@@ -44,8 +49,10 @@ public:
   void sort(FreeModuleOrder& order);
 
 private:
+  Basis(const Basis&); // not available
+
   const PolyRing& mRing;
-  std::vector<Poly*> mGenerators;
+  std::vector<std::unique_ptr<Poly>> mGenerators;
 };
 
 #endif
diff --git a/src/mathicgb/MathicIO.hpp b/src/mathicgb/MathicIO.hpp
index 58da553..43dae37 100755
--- a/src/mathicgb/MathicIO.hpp
+++ b/src/mathicgb/MathicIO.hpp
@@ -1,10 +1,11 @@
 #ifndef MATHICGB_MATHIC_IO_GUARD
 #define MATHICGB_MATHIC_IO_GUARD
 
+#include "Basis.hpp"
+#include "Poly.hpp"
 #include "Scanner.hpp"
 #include "PolyRing.hpp"
 #include "MonoProcessor.hpp"
-#include "Poly.hpp"
 #include <ostream>
 #include <string>
 
@@ -63,6 +64,18 @@ public:
     std::ostream& out
   );
 
+  Basis readBasis(
+    const PolyRing& ring,
+    const bool readComponent,
+    Scanner& in
+  );
+
+  void writeBasis(
+    const Basis& basis,
+    const bool writeComponent,
+    std::ostream& out
+  );
+
   Poly readPoly(
     const PolyRing& ring,
     const bool readComponent,
@@ -254,22 +267,25 @@ Basis MathicIO::readBasis(
   const bool readComponent,
   Scanner& in
 ) {
-  const auto polyCount = mIn.readInteger<size_t>();
+  const auto polyCount = in.readInteger<size_t>();
+  Basis basis(ring);
   for (size_t i = 0; i < polyCount; ++i) {
     auto p = make_unique<Poly>(readPoly(ring, readComponent, in));
     p->sortTermsDescending();
-    basis->insert(std::move(p));
+    basis.insert(std::move(p));
   }
+  return std::move(basis);
 }
 
 void MathicIO::writeBasis(
   const Basis& basis,
+  const bool writeComponent,
   std::ostream& out
 ) {
   out << basis.size() << '\n';
   for (size_t i = 0; i < basis.size(); ++i) {
     out << ' ';
-    writePoly(*basis.getPoly(i), out);
+    writePoly(*basis.getPoly(i), writeComponent, out);
     out << '\n';
   }
 }
diff --git a/src/test/MathicIO.cpp b/src/test/MathicIO.cpp
index f05ec3e..ca82054 100755
--- a/src/test/MathicIO.cpp
+++ b/src/test/MathicIO.cpp
@@ -104,10 +104,43 @@ TEST(MathicIO, ReadWriteMonomial) {
   check("ab<2>", 2,  0,1,  1,1);
 }
 
-TEST(MathicIO, ReadWritePoly) {
+TEST(MathicIO, ReadWriteBasis) {
   typedef PolyRing::Monoid Monoid;
   typedef PolyRing::Field Field;
+  PolyRing ring(Field(101), Monoid(28));
+
+  auto check = [&](
+    const char* const inStr,
+    const char* const outStr,
+    const bool doComponent
+  ) {
+    for (int i = 0; i < 2; ++i) {
+      const char* str = i == 0 ? inStr : outStr;
+      if (str == 0)
+        continue;
 
+      Scanner in(str);
+      const auto basis = MathicIO().readBasis(ring, doComponent, in);
+      std::ostringstream out;
+      MathicIO().writeBasis(basis, doComponent, out);
+      const auto correctStr = outStr == 0 ? inStr : outStr;
+      ASSERT_EQ(correctStr, out.str());
+    }
+  };
+
+  check("0", "0\n", false);
+  check("0", "0\n", true);
+  check("1 0", "1\n 0\n", false);
+  check("1 0", "1\n 0\n", true);
+  
+  check("1 1", "1\n 1\n", false);
+  check("1 a<0>", "1\n a<0>\n", true);
+  check("2 a b", "2\n a\n b\n", false);
+}
+
+TEST(MathicIO, ReadWritePoly) {
+  typedef PolyRing::Monoid Monoid;
+  typedef PolyRing::Field Field;
   PolyRing ring(Field(101), Monoid(28));
 
   auto check = [&](

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/mathicgb.git



More information about the debian-science-commits mailing list