diff options
| author | Sebastiano Tronto <sebastiano@tronto.net> | 2025-04-22 14:17:03 +0200 |
|---|---|---|
| committer | Sebastiano Tronto <sebastiano@tronto.net> | 2025-04-22 14:17:03 +0200 |
| commit | ac652bb6fb45099008e862e3ced650299dc3ebb7 (patch) | |
| tree | 12fb1c902c271fbeac41c4ee416cf1cd76b16fd7 /cpp | |
| parent | 71e104d84b3538e15f27df79b151e6b49cbad1eb (diff) | |
| parent | e391c4624055138f075c0e5772ccaf8ede094b5a (diff) | |
| download | nissy-core-ac652bb6fb45099008e862e3ced650299dc3ebb7.tar.gz nissy-core-ac652bb6fb45099008e862e3ced650299dc3ebb7.zip | |
Merge branch 'master' into extend_moves
Diffstat (limited to 'cpp')
| -rw-r--r-- | cpp/examples/move.cpp | 17 | ||||
| -rw-r--r-- | cpp/examples/move_convert.cpp | 24 | ||||
| -rw-r--r-- | cpp/nissy.cpp | 66 | ||||
| -rw-r--r-- | cpp/nissy.h | 7 |
4 files changed, 40 insertions, 74 deletions
diff --git a/cpp/examples/move.cpp b/cpp/examples/move.cpp new file mode 100644 index 0000000..970a65d --- /dev/null +++ b/cpp/examples/move.cpp | |||
| @@ -0,0 +1,17 @@ | |||
| 1 | /* A simple example showing how to move a cube and print it in H48 format. */ | ||
| 2 | |||
| 3 | #include "../nissy.h" | ||
| 4 | #include <iostream> | ||
| 5 | |||
| 6 | int main() { | ||
| 7 | nissy::cube c; | ||
| 8 | if (!c.move("R' U' F").ok()) { | ||
| 9 | std::cout << "Error moving the cube!" << std::endl; | ||
| 10 | return 1; | ||
| 11 | } | ||
| 12 | |||
| 13 | auto str = c.to_string(); | ||
| 14 | std::cout << "Cube after R' U' F:" << std::endl << str << std::endl; | ||
| 15 | |||
| 16 | return 0; | ||
| 17 | } | ||
diff --git a/cpp/examples/move_convert.cpp b/cpp/examples/move_convert.cpp deleted file mode 100644 index 11398df..0000000 --- a/cpp/examples/move_convert.cpp +++ /dev/null | |||
| @@ -1,24 +0,0 @@ | |||
| 1 | /* A simple example showing how to move a cube and print it in H48 format. */ | ||
| 2 | |||
| 3 | #include "../nissy.h" | ||
| 4 | #include <iostream> | ||
| 5 | |||
| 6 | int main() { | ||
| 7 | nissy::cube c; | ||
| 8 | if (!c.move("R' U' F").ok()) { | ||
| 9 | std::cout << "Error moving the cube!" << std::endl; | ||
| 10 | return 1; | ||
| 11 | } | ||
| 12 | |||
| 13 | auto string_or_error = c.to_string("H48"); | ||
| 14 | if (std::holds_alternative<nissy::error>(string_or_error)) { | ||
| 15 | std::cout << "Error converting cube!" << std::endl; | ||
| 16 | return 1; | ||
| 17 | } | ||
| 18 | |||
| 19 | auto str = std::get<std::string>(string_or_error); | ||
| 20 | std::cout << "Cube in H48 format after R' U' F:" << std::endl | ||
| 21 | << str << std::endl; | ||
| 22 | |||
| 23 | return 0; | ||
| 24 | } | ||
diff --git a/cpp/nissy.cpp b/cpp/nissy.cpp index 88df0f2..3535553 100644 --- a/cpp/nissy.cpp +++ b/cpp/nissy.cpp | |||
| @@ -13,8 +13,6 @@ extern "C" { | |||
| 13 | long long nissy_inverse(const char *, char *); | 13 | long long nissy_inverse(const char *, char *); |
| 14 | long long nissy_applymoves(const char *, const char *, char *); | 14 | long long nissy_applymoves(const char *, const char *, char *); |
| 15 | long long nissy_applytrans(const char *, const char *, char *); | 15 | long long nissy_applytrans(const char *, const char *, char *); |
| 16 | long long nissy_convert(const char *, const char *, const char *, | ||
| 17 | unsigned, char *); | ||
| 18 | long long nissy_getcube(long long, long long, long long, long long, | 16 | long long nissy_getcube(long long, long long, long long, long long, |
| 19 | const char *, char *); | 17 | const char *, char *); |
| 20 | long long nissy_solverinfo(const char *, char *); | 18 | long long nissy_solverinfo(const char *, char *); |
| @@ -43,7 +41,6 @@ namespace nissy { | |||
| 43 | const error error::UNSOLVABLE_CUBE{-11}; | 41 | const error error::UNSOLVABLE_CUBE{-11}; |
| 44 | const error error::INVALID_MOVES{-20}; | 42 | const error error::INVALID_MOVES{-20}; |
| 45 | const error error::INVALID_TRANS{-30}; | 43 | const error error::INVALID_TRANS{-30}; |
| 46 | const error error::INVALID_FORMAT{-40}; | ||
| 47 | const error error::INVALID_SOLVER{-50}; | 44 | const error error::INVALID_SOLVER{-50}; |
| 48 | const error error::NULL_POINTER{-60}; | 45 | const error error::NULL_POINTER{-60}; |
| 49 | const error error::BUFFER_SIZE{-61}; | 46 | const error error::BUFFER_SIZE{-61}; |
| @@ -52,9 +49,7 @@ namespace nissy { | |||
| 52 | const error error::UNKNOWN{-999}; | 49 | const error error::UNKNOWN{-999}; |
| 53 | 50 | ||
| 54 | namespace size { | 51 | namespace size { |
| 55 | constexpr size_t B32 = 22; | 52 | constexpr size_t CUBE = 22; |
| 56 | constexpr size_t H48 = 88; | ||
| 57 | constexpr size_t CUBE_MAX = H48; | ||
| 58 | constexpr size_t TRANSFORMATION = 12; | 53 | constexpr size_t TRANSFORMATION = 12; |
| 59 | constexpr size_t DATAID = 255; | 54 | constexpr size_t DATAID = 255; |
| 60 | } | 55 | } |
| @@ -65,71 +60,54 @@ namespace nissy { | |||
| 65 | 60 | ||
| 66 | error cube::move(const std::string& moves) | 61 | error cube::move(const std::string& moves) |
| 67 | { | 62 | { |
| 68 | char result[size::B32]; | 63 | char result[size::CUBE]; |
| 69 | long long err = nissy_applymoves( | 64 | long long err = nissy_applymoves( |
| 70 | m_b32.c_str(), moves.c_str(), result); | 65 | m_str.c_str(), moves.c_str(), result); |
| 71 | if (err < 0) | 66 | if (err < 0) |
| 72 | return error{err}; | 67 | return error{err}; |
| 73 | m_b32 = result; | 68 | m_str = result; |
| 74 | return error::OK; | 69 | return error::OK; |
| 75 | } | 70 | } |
| 76 | 71 | ||
| 77 | error cube::transform(const std::string& trans) | 72 | error cube::transform(const std::string& trans) |
| 78 | { | 73 | { |
| 79 | char result[size::B32]; | 74 | char result[size::CUBE]; |
| 80 | long long err = nissy_applytrans( | 75 | long long err = nissy_applytrans( |
| 81 | m_b32.c_str(), trans.c_str(), result); | 76 | m_str.c_str(), trans.c_str(), result); |
| 82 | if (err < 0) | 77 | if (err < 0) |
| 83 | return error{err}; | 78 | return error{err}; |
| 84 | m_b32 = result; | 79 | m_str = result; |
| 85 | return error::OK; | 80 | return error::OK; |
| 86 | } | 81 | } |
| 87 | 82 | ||
| 88 | void cube::invert() | 83 | void cube::invert() |
| 89 | { | 84 | { |
| 90 | char result[size::B32]; | 85 | char result[size::CUBE]; |
| 91 | nissy_inverse(m_b32.c_str(), result); | 86 | nissy_inverse(m_str.c_str(), result); |
| 92 | m_b32 = result; | 87 | m_str = result; |
| 93 | } | 88 | } |
| 94 | 89 | ||
| 95 | void cube::compose(const cube& other) | 90 | void cube::compose(const cube& other) |
| 96 | { | 91 | { |
| 97 | char result[size::B32]; | 92 | char result[size::CUBE]; |
| 98 | nissy_compose( | 93 | nissy_compose( |
| 99 | m_b32.c_str(), other.to_string().c_str(), result); | 94 | m_str.c_str(), other.to_string().c_str(), result); |
| 100 | m_b32 = result; | 95 | m_str = result; |
| 101 | } | 96 | } |
| 102 | 97 | ||
| 103 | std::string cube::to_string() const { return m_b32; } | 98 | std::string cube::to_string() const { return m_str; } |
| 104 | |||
| 105 | std::variant<std::string, error> | ||
| 106 | cube::to_string(const std::string& format) const | ||
| 107 | { | ||
| 108 | char result[size::CUBE_MAX]; | ||
| 109 | auto err = nissy_convert("B32", format.c_str(), | ||
| 110 | m_b32.c_str(), size::CUBE_MAX, result); | ||
| 111 | if (err < 0) | ||
| 112 | return error{err}; | ||
| 113 | else | ||
| 114 | return result; | ||
| 115 | } | ||
| 116 | 99 | ||
| 117 | std::variant<cube, error> | 100 | std::variant<cube, error> |
| 118 | cube::from_string(const std::string& str) | 101 | cube::from_string(const std::string& str) |
| 119 | { | 102 | { |
| 120 | return from_string(str, "B32"); | 103 | /* Check that the cube is valid by making a single move */ |
| 121 | } | 104 | char result[size::CUBE]; |
| 122 | 105 | auto err = nissy_applymoves(str.c_str(), "U", result); | |
| 123 | std::variant<cube, error> | ||
| 124 | cube::from_string(const std::string& str, const std::string& format) | ||
| 125 | { | ||
| 126 | char result[size::B32]; | ||
| 127 | cube c; | ||
| 128 | auto err = nissy_convert(format.c_str(), | ||
| 129 | "B32", c.m_b32.c_str(), size::B32, result); | ||
| 130 | if (err < 0) | 106 | if (err < 0) |
| 131 | return error{err}; | 107 | return error{err}; |
| 132 | c.m_b32 = result; | 108 | |
| 109 | cube c; | ||
| 110 | c.m_str = str; | ||
| 133 | return c; | 111 | return c; |
| 134 | } | 112 | } |
| 135 | 113 | ||
| @@ -143,13 +121,13 @@ namespace nissy { | |||
| 143 | cube::get(long long ep, long long eo, long long cp, long long co, | 121 | cube::get(long long ep, long long eo, long long cp, long long co, |
| 144 | const std::string& options) | 122 | const std::string& options) |
| 145 | { | 123 | { |
| 146 | char result[size::B32]; | 124 | char result[size::CUBE]; |
| 147 | cube c; | 125 | cube c; |
| 148 | auto err = nissy_getcube( | 126 | auto err = nissy_getcube( |
| 149 | ep, eo, cp, co, options.c_str(), result); | 127 | ep, eo, cp, co, options.c_str(), result); |
| 150 | if (err < 0) | 128 | if (err < 0) |
| 151 | return error{err}; | 129 | return error{err}; |
| 152 | c.m_b32 = result; | 130 | c.m_str = result; |
| 153 | return c; | 131 | return c; |
| 154 | } | 132 | } |
| 155 | 133 | ||
diff --git a/cpp/nissy.h b/cpp/nissy.h index 4b9c1c9..2eb0f42 100644 --- a/cpp/nissy.h +++ b/cpp/nissy.h | |||
| @@ -38,7 +38,6 @@ namespace nissy { | |||
| 38 | static const error UNSOLVABLE_CUBE; | 38 | static const error UNSOLVABLE_CUBE; |
| 39 | static const error INVALID_MOVES; | 39 | static const error INVALID_MOVES; |
| 40 | static const error INVALID_TRANS; | 40 | static const error INVALID_TRANS; |
| 41 | static const error INVALID_FORMAT; | ||
| 42 | static const error INVALID_SOLVER; | 41 | static const error INVALID_SOLVER; |
| 43 | static const error NULL_POINTER; | 42 | static const error NULL_POINTER; |
| 44 | static const error BUFFER_SIZE; | 43 | static const error BUFFER_SIZE; |
| @@ -55,13 +54,9 @@ namespace nissy { | |||
| 55 | void invert(); | 54 | void invert(); |
| 56 | void compose(const cube&); | 55 | void compose(const cube&); |
| 57 | std::string to_string() const; | 56 | std::string to_string() const; |
| 58 | std::variant<std::string, error> to_string( | ||
| 59 | const std::string& format) const; | ||
| 60 | 57 | ||
| 61 | static std::variant<cube, error> from_string( | 58 | static std::variant<cube, error> from_string( |
| 62 | const std::string&); | 59 | const std::string&); |
| 63 | static std::variant<cube, error> from_string( | ||
| 64 | const std::string& str, const std::string& format); | ||
| 65 | static std::variant<cube, error> get( | 60 | static std::variant<cube, error> get( |
| 66 | long long ep, long long eo, long long cp, long long co); | 61 | long long ep, long long eo, long long cp, long long co); |
| 67 | static std::variant<cube, error> get( | 62 | static std::variant<cube, error> get( |
| @@ -69,7 +64,7 @@ namespace nissy { | |||
| 69 | const std::string& options); | 64 | const std::string& options); |
| 70 | 65 | ||
| 71 | private: | 66 | private: |
| 72 | std::string m_b32{"ABCDEFGH=ABCDEFGHIJKL"}; | 67 | std::string m_str{"ABCDEFGH=ABCDEFGHIJKL=A"}; |
| 73 | }; | 68 | }; |
| 74 | 69 | ||
| 75 | class solver { | 70 | class solver { |
