From 40834ece6e988135ce91372ed5d35400f34ae2f5 Mon Sep 17 00:00:00 2001 From: Dmitry Kokorin Date: Mon, 22 Feb 2016 00:13:25 +0300 Subject: [PATCH] Bob 3: one iteration through a string --- cpp/bob/bob.cpp | 51 +++++++++++++++++-------------------------------- cpp/bob/bob.h | 4 ++-- 2 files changed, 20 insertions(+), 35 deletions(-) diff --git a/cpp/bob/bob.cpp b/cpp/bob/bob.cpp index 7884efb..21e8f9a 100644 --- a/cpp/bob/bob.cpp +++ b/cpp/bob/bob.cpp @@ -7,47 +7,32 @@ namespace bob { -using namespace std; - -namespace { - -void trim_spaces(string &str) -{ - str.erase(remove_if(str.begin(), str.end(), - [](char c){return isspace(static_cast(c));}), - str.end()); -} - -string to_uppercase(const string &str) -{ - string result = str; - for (auto & c: result) - c = toupper(c); - - return result; -} - -bool has_alpha(const string &str) -{ - return find_if(str.begin(), str.end(), - [](char c){return isalpha(static_cast(c));}) != str.end(); -} - -} - const char * hey(const char input[]) { + using namespace std; - string str(input); - trim_spaces(str); + const string str(input); - if (str.empty()) + string::const_reverse_iterator i; + + i = find_if(str.crbegin(), str.crend(), [](char c){return !isspace(c);}); + + if (i == str.crend()) return "Fine. Be that way!"; - if (has_alpha(str) && str == to_uppercase(str)) + bool is_question = *i == '?'; + + i = find_if(i, str.crend(), [](char c){return isalpha(c);}); + + bool has_alpha = i != str.crend(); + + bool is_uppercase = all_of(i, str.crend(), + [](char c){return isupper(c) || !isalpha(c);}); + + if (has_alpha && is_uppercase) return "Whoa, chill out!"; - if ('?' == str.back()) + if (is_question) return "Sure."; return "Whatever."; diff --git a/cpp/bob/bob.h b/cpp/bob/bob.h index 78aa7f4..2508b73 100644 --- a/cpp/bob/bob.h +++ b/cpp/bob/bob.h @@ -1,8 +1,8 @@ #pragma once -#define EXERCISM_RUN_ALL_TESTS true +#define EXERCISM_RUN_ALL_TESTS namespace bob { - const char * hey(const char str[]); + const char * hey(const char input[]); }