view interps/rail/src/Dir.cpp @ 12256:821155c00e34 draft

<fizzie> ` sed -e \'s|wisdom|bin|\' < ../bin/culprits > ../bin/cblprits; chmod a+x ../bin/cblprits
author HackEso <hackeso@esolangs.org>
date Sat, 07 Dec 2019 23:36:22 +0000
parents 859f9b4339e6
children
line wrap: on
line source

// Dir.cpp

#include "lib.h"
#include "Dir.h"

using namespace std;

namespace Dir
{
  t back(t current)
  {
    static t result[] = {south, southwest, west, northwest,
                         north, northeast, east, southeast};
    check(current, "Dir::back()");
    return result[current];
  }

  t left(t current)
  {
    static t result[] = {northwest, north, northeast, east,
                         southeast, south, southwest, west};
    check(current, "Dir::left()");
    return result[current];
  }

  t right(t current)
  {
    static t result[] = {northeast, east, southeast, south,
                         southwest, west, northwest, north};
    check(current, "Dir::right()");
    return result[current];
  }

  string dirToString(t current)
  {
    static string result[] = {"north", "northeast", "east", "southeast",
                              "south", "southwest", "west", "northwest"};
    if (current >= min && current <= max)
    {
      return result[current];
    }
    else
    {
      return intToString(current);
    }
  }

  Vec dirToVec(t current)
  {
    static Vec result[] = {Vec(0, -1), Vec(1, -1), Vec(1, 0), Vec(1, 1),
                           Vec(0, 1), Vec(-1, 1), Vec(-1, 0), Vec(-1, -1)};
    check(current, "Dir::dirToVec()");
    return result[current];
  }

  void check(t current, string const & name)
  {
    if (current < min || current > max)
    {
      throw InternalException(name + ": Invalid Direction: "
                              + dirToString(current));
    }
  }
}