Quellcode durchsuchen

Add support for printing out DC info. Move stringification of sign enum into an ostream<<.

Sam Jaffe vor 4 Jahren
Ursprung
Commit
fca9020312
5 geänderte Dateien mit 36 neuen und 15 gelöschten Zeilen
  1. 1 1
      include/dice-roll/die.h
  2. 1 10
      src/die.cxx
  3. 23 2
      src/io.cxx
  4. 2 2
      src/roll.cxx
  5. 9 0
      test/parser_test.cxx

+ 1 - 1
include/dice-roll/die.h

@@ -20,7 +20,6 @@ template <typename T> static sign sgn(T val) {
 }
 
 int sgn(sign);
-std::string str(sign);
 
 struct die {
   sign sgn;
@@ -69,6 +68,7 @@ struct dice {
  */
 dice from_string(std::string const & strdice);
 
+std::ostream & operator<<(std::ostream & out, sign s);
 std::ostream & operator<<(std::ostream & out, dice const & d);
 std::istream & operator>>(std::istream & out, dice & d);
 }

+ 1 - 10
src/die.cxx

@@ -11,17 +11,8 @@
 #include "dice-roll/exception.h"
 
 namespace dice {
+
 int sgn(sign s) { return s == sign::MINUS ? -1 : 1; }
-std::string str(sign s) {
-  switch (s) {
-  case sign::PLUS:
-    return "+";
-  case sign::MINUS:
-    return "-";
-  default:
-    return "";
-  }
-}
 
 mod::operator int() const { return sgn(sign) * value; }
 

+ 23 - 2
src/io.cxx

@@ -15,13 +15,34 @@
 
 namespace dice {
 
+std::ostream & operator<<(std::ostream & out, sign s) {
+  switch (s) {
+    case sign::PLUS: return out << '+';
+    case sign::MINUS: return out << '-';
+    case sign::ZERO: return out;
+  }
+}
+
+std::ostream & operator<<(std::ostream & out, difficulty_class::test t) {
+  switch (t) {
+    case difficulty_class::test::None: return out;
+    case difficulty_class::test::Less: return out << '<';
+    case difficulty_class::test::LessOrEqual: return out << '<' << '=';
+    case difficulty_class::test::Greater: return out << '>';
+    case difficulty_class::test::GreaterOrEqual: return out << '>' << '=';
+  }
+}
+
 std::ostream & operator<<(std::ostream & out, dice const & d) {
   if (d.num != 1) out << d.num << '{';
   for (die const & di : d.of) {
-    out << str(di.sgn) << di.num << 'd' << di.sides;
+    out << di.sgn << di.num << 'd' << di.sides;
   }
   for (mod m : d.modifier) {
-    out << str(m.sign) << m.value;
+    out << m.sign << m.value;
+  }
+  if (d.dc.comp != difficulty_class::test::None) {
+    out << d.dc.comp << d.dc.against;
   }
   if (d.num != 1) out << '}';
   return out;

+ 2 - 2
src/roll.cxx

@@ -25,7 +25,7 @@ dice_roll::operator int() const {
 }
 
 std::ostream & operator<<(std::ostream & out, die_roll const & r) {
-  out << str(r.sign);
+  out << r.sign;
   switch (r.rolled.size()) {
   case 0:
       // Prevent crashes if we somehow get a 0dM expression
@@ -49,7 +49,7 @@ std::ostream & operator<<(std::ostream & out, dice_roll const & r) {
     out << dr;
   }
   for (mod const & m : r.modifiers) {
-    out << str(m.sign) << m.value;
+    out << m.sign << m.value;
   }
   return out;
 }

+ 9 - 0
test/parser_test.cxx

@@ -167,3 +167,12 @@ TEST(DiceIOTest, CanReadDirectlyFromStream) {
   out << d;
   EXPECT_THAT(out.str(), Eq("2d6-1d6-4+5"));
 }
+
+TEST(DiceIOTest, PrintsOutDCMarker) {
+  std::string const tokens[] = { "<", "<=", ">", ">=" };
+  for (auto &tok : tokens) {
+    std::stringstream ss;
+    ss << dice::from_string("1d20" + tok + "10");
+    EXPECT_THAT(ss.str(), "1d20" + tok + "10");
+  }
+}