From 91d7f8da33f62e2886e369f790a2d103d5392156 Mon Sep 17 00:00:00 2001 From: Leonetienne Date: Sat, 12 Feb 2022 18:19:05 +0100 Subject: [PATCH] Added CharTools functionality --- Src/CMakeLists.txt | 5 +++- Src/CharTools.cpp | 64 ++++++++++++++++++++++++++++++++++++++++++++++ Src/CharTools.h | 41 +++++++++++++++++++++++++++++ 3 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 Src/CharTools.cpp create mode 100644 Src/CharTools.h diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index 4aacd6e..e693251 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -3,4 +3,7 @@ project(StringTools) set(CMAKE_CXX_STANDARD 17) -add_library(StringTools StringTools.cpp) +add_library(StringTools + StringTools.cpp + CharTools.cpp +) diff --git a/Src/CharTools.cpp b/Src/CharTools.cpp new file mode 100644 index 0000000..79cc679 --- /dev/null +++ b/Src/CharTools.cpp @@ -0,0 +1,64 @@ +#include "CharTools.h" +#include + +bool CharTools::IsVowel(const char c, const std::string &vowels) { + return std::any_of( + vowels.cbegin(), + vowels.cend(), + [c](const char vowel) { + return c == vowel; + } + ); +} + +bool CharTools::IsLetter(const char c) { + // Re-implementing IsUpper and MakeLower to prevent stack-overflow by endless recursion + const char lowercase_c = !(c & (1<<5)) ? (c | (1<<5)) : c; + + return (lowercase_c >= 'a') && (lowercase_c <= 'z'); +} + +bool CharTools::IsGeneric(const char c) { + return (c == UPPERCASE) || (c == LOWERCASE); +} + +bool CharTools::IsUpper(const char c) { + if ((!IsLetter(c)) && (!IsGeneric(c))) + return false; + else + return !(c & (1<<5)); +} + +char CharTools::MakeUpper(char c) { + if ((!IsLetter(c)) && (!IsGeneric(c))) + return c; + else if (IsUpper(c)) + return c; + else + return c & ~(1<<5); +} + +char CharTools::MakeLower(char c) { + if ((!IsLetter(c)) && (!IsGeneric(c))) + return c; + else if (!IsUpper(c)) + return c; + else + return c | (1<<5); +} + +char CharTools::GetSign(char c) { + if (IsUpper(c)) + return UPPERCASE; + else + return LOWERCASE; +} + +char CharTools::CopySign(char sign, char c) { + if ((!IsLetter(c)) && (!IsGeneric(c))) + return c; + if (IsUpper(sign)) + return MakeUpper(c); + else + return MakeLower(c); +} diff --git a/Src/CharTools.h b/Src/CharTools.h new file mode 100644 index 0000000..3d7f255 --- /dev/null +++ b/Src/CharTools.h @@ -0,0 +1,41 @@ +#ifndef STRINGTOOLS_CHARTOOLS_H +#define STRINGTOOLS_CHARTOOLS_H + +#include + +/* Handy utensils to manipulate characters */ + +class CharTools { +public: + //! Checks whether or not `c` is a vowel. You can define custom vowel characters. + static bool IsVowel(const char c, const std::string& vowels = "euioay"); + + //! Returns whether or not `c` is a letter. + static bool IsLetter(const char c); + + //! Returns whether or not `c` is a generic character (that contains JUST the sign) + static bool IsGeneric(const char c); + + //! Checks whether or not `c` is an uppercase character. + static bool IsUpper(const char c); + + //! Will return `c` as an uppercase character. + static char MakeUpper(char c); + + //! Will return `c` as a lowercase character. + static char MakeLower(char c); + + //! Will return an empty character with the same sign/capitalization as `c`. + static char GetSign(char c); + + //! Will return `c` with the same capitalization as `sign`. + static char CopySign(char sign, char c); + + //! Generic uppercase character. + static constexpr char UPPERCASE = 0; + + //! Generic lowercase character. + static constexpr char LOWERCASE = (1<<5); +}; + +#endif //STRINGTOOLS_CHARTOOLS_H