Enumerations

This page is under construction. Please come back later.
#undef NDEBUG
#include "Utils.hpp"
#include <clocale>
#include <codecvt>
#include <iostream>
#include <map>
#include <string>
std::locale utf8loc(std::locale(), new std::codecvt_utf8<wchar_t>);
using namespace Utils;
using namespace std;
enum class CompassPoint {
NORTH,
EAST,
SOUTH,
WEST
};
wstring to_wstring(CompassPoint e ) {
static const map<int, wstring> m = {
{0, L"NORTH"},
{1, L"EAST"},
{2, L"SOUTH"},
{3, L"WEST"}
};
return m.at(static_cast<int>(e));
}
wostream &operator<<(wostream& os, CompassPoint e ) {
return os << to_wstring(e);
}
wstring compass_point_to_string(CompassPoint const c) noexcept {
const wchar_t* result = L"";
switch (c) {
case CompassPoint::NORTH:
result = L"North";
break;
case CompassPoint::EAST:
result = L"East";
break;
case CompassPoint::SOUTH:
result = L"South";
break;
case CompassPoint::WEST:
result = L"West";
break;
}
return result;
}
CompassPoint turn_right(CompassPoint const c) noexcept {
if (c == CompassPoint::NORTH) {
return CompassPoint::EAST;
} else if (c == CompassPoint::EAST) {
return CompassPoint::SOUTH;
} else if (c == CompassPoint::SOUTH) {
return CompassPoint::WEST;
} else {
return CompassPoint::NORTH;
}
}
int main(int argc, char **argv) {
setlocale(LC_ALL, "en_US.UTF-8");
wcout.imbue(utf8loc);
wcin.imbue(utf8loc);
CompassPoint cp1 = CompassPoint::NORTH;
wcout << L"cp1: " << to_wstring(cp1) << endl;
wcout << L"SOUTH: " << compass_point_to_string(CompassPoint::SOUTH) << endl;
wcout << L"turnRight(cp1): " << compass_point_to_string(turn_right(cp1)) << endl;
CompassPoint const CP2 = CompassPoint::EAST;
if (cp1 == CP2) {
wcout << L"cp1 == cp2" << endl;
} else {
wcout << L"cp1 != cp2" << endl;
}
cp1 = CP2;
if (cp1 == CP2) {
wcout << L"cp1 == cp2" << endl;
} else {
wcout << L"cp1 != cp2" << endl;
}
return 0;
}
Output
$ g++ -std=c++17 Enums1.cpp -o Enums1 -lfmt
$ ./Enums1
cp1: 0
SOUTH: South
turnRight(cp1): East
cp1 != cp2
cp1 == cp2
#undef NDEBUG
#include "Utils.hpp"
#include <clocale>
#include <codecvt>
#include <iostream>
#include <map>
#include <string>
std::locale utf8loc(std::locale(), new std::codecvt_utf8<wchar_t>);
using namespace Utils;
using namespace std;
enum class Color {
RED = 1,
GREEN = 2,
YELLOW = 3,
BLUE = 4,
MAGENTA = 5,
CYAN = 6
};
wstring to_wstring(Color e ) {
static const map<int, wstring> m = {
{1, L"RED"},
{2, L"GREEN"},
{3, L"YELLOW"},
{4, L"BLUE"},
{5, L"MAGENTA"},
{6, L"CYAN"}
};
return m.at(static_cast<int>(e));
}
wostream &operator<<(wostream& os, Color e ) {
return os << to_wstring(e);
}
Color combine_colors(Color const c1, Color const c2) noexcept {
int const i1 = static_cast<int>(c1);
int const i2 = static_cast<int>(c2);
int const RESULT = i1 | i2;
Color const RETURN_COLOR = static_cast<Color>(RESULT);
return RETURN_COLOR;
}
int main(int argc, char **argv) {
setlocale(LC_ALL, "en_US.UTF-8");
wcout.imbue(utf8loc);
wcin.imbue(utf8loc);
Color c1 = Color::BLUE;
wcout << L"c1: " << to_wstring(c1) << endl;
wcout << L"RED: " << to_wstring(Color::RED) << endl;
wcout << L"combineColors(c1, RED): " << to_wstring(combine_colors(c1, Color::RED)) << endl;
Color const c2 = Color::GREEN;
wcout << L"combineColors(c1, c2): " << to_wstring(combine_colors(c1, c2)) << endl;
if (c1 == c2) {
wcout << L"c1 == c2" << endl;
} else {
wcout << L"c1 != c2" << endl;
}
c1 = c2;
if (c1 == c2) {
wcout << L"c1 == c2" << endl;
} else {
wcout << L"c1 != c2" << endl;
}
Color const BAD = static_cast<Color>(7);
wcout << L"bad: " << to_wstring(BAD) << endl;
return 0;
}
Output
$ g++ -std=c++17 Enums2.cpp -o Enums2 -lfmt
$ ./Enums2
c1: 4
RED: 1
combineColors(c1, RED): 5
combineColors(c1, c2): 6
c1 != c2
c1 == c2
bad: 7
Questions
- {{Who's on first?}}
- {{Who's on second?}}
- {{Who's on third?}}
Projects
More ★'s indicate higher difficulty level.
References
-
[[C++ Programming Language]], 4th Edition, Bjarne Stroustrup, Addison-Wesley, 2013, ISBN 978-0321563842.
- [[C++ Language Reference]]
- [[cplusplus.com]]
- [[Cprogramming.com]]
Pure Programmer


