/*
1. Sa se defineasca o clasa "Radio" avand urmatoarea data membra privata: radioName (std::string).
Observatie: Clasa nu va dispune de metode de tip getter si setter pentru "radioName".
2. Sa se utilizeze un container STL asociativ in care sa se stocheze urmatoarele asocieri:
AEHC -> operational,
AEQE -> neoperational,
AEQK -> operational,
AEQK -> operational,
AEQP -> neoperational
Observatie: Cheia va fi de tipul "Radio", valoarea de tip "bool" - reprezentand flag-ul care indica operabilitatea radio-ului respectiv (true -> operational, false -> neoperational). Se vor admite elemente cu chei identice.
3. Sa se stearga din container-ul definit la pct. 2 toate radio-urile neoperabile.
4. Sa se extraga intr-un std::vector<std::string> toate numele de radio-uri, astfel incat sa nu existe duplicate. Se vor folosi functii STL si dupa caz, se va utiliza si un functor.
Observatie: Pentru rezolvarea exercitiilor se vor folosi functii STL, exceptand std::for_each.
*/
#include <algorithm>
#include <functional>
#include <iostream>
#include <map>
#include <string>
#include <type_traits>
#include <vector>
namespace consts
{
constexpr const char* AEHC = "AEHC";
constexpr const char* AEQE = "AEQE";
constexpr const char* AEQK = "AEQK";
constexpr const char* AEQP = "AEQP";
} // namespace consts
namespace radio
{
class Radio final
{
public:
explicit Radio(const std::string& radioName)
: radioName_{ radioName }
{}
enum class EOperationalState
{
EOperationalState_Disabled,
EOperationalState_Enabled
};
private:
friend class RadioName;
friend bool operator<(const Radio& lhs, const Radio& rhs) noexcept;
friend std::ostream& operator<<(std::ostream& out, const Radio& radio) noexcept;
std::string radioName_;
};
class RadioName final
{
public:
std::string operator()(const std::pair<Radio, bool>& p) const noexcept
{
return p.first.radioName_;
}
};
bool operator<(const Radio& lhs, const Radio& rhs) noexcept
{
return std::less<decltype(lhs.radioName_)>()(lhs.radioName_, rhs.radioName_);
}
std::ostream& operator<<(std::ostream& out, const Radio& radio) noexcept
{
out << radio.radioName_;
return out;
}
template <class Key, class T>
void printMap(const std::multimap<Key, T>& m) noexcept
{
for (const auto& p: m)
{
std::cout << p.first << " -> " << p.second << std::endl;
}
}
template <class T>
void printVec(const std::vector<T>& v) noexcept
{
for (const auto& e : v)
{
std::cout << e << std::endl;
}
}
void eraseDisabledRadios(std::multimap<Radio, bool>& m) noexcept
{
for(auto it{ m.cbegin() }; it!= m.cend();)
{
if (!it->second)
{
it = m.erase(it);
}
else
{
++it;
}
}
}
void fillWithUniqueRadioNames(
const std::multimap<Radio, bool>& m,
std::vector<std::string>& v) noexcept
{
std::transform(m.cbegin(), m.cend(), std::back_inserter(v), RadioName());
const auto it{ std::unique(v.begin(), v.end()) };
v.erase(it, v.end());
}
} // namespace radio
int main()
{
std::multimap<radio::Radio, bool> m{
{
radio::Radio{ consts::AEHC },
static_cast<std::underlying_type_t<radio::Radio::EOperationalState>>(radio::Radio::EOperationalState::EOperationalState_Enabled)
},
{
radio::Radio{ consts::AEQE },
static_cast<std::underlying_type_t<radio::Radio::EOperationalState>>(radio::Radio::EOperationalState::EOperationalState_Disabled)
},
{
radio::Radio{ consts::AEQK },
static_cast<std::underlying_type_t<radio::Radio::EOperationalState>>(radio::Radio::EOperationalState::EOperationalState_Enabled)
},
{
radio::Radio{ consts::AEQK },
static_cast<std::underlying_type_t<radio::Radio::EOperationalState>>(radio::Radio::EOperationalState::EOperationalState_Enabled)
},
{
radio::Radio{ consts::AEQP },
static_cast<std::underlying_type_t<radio::Radio::EOperationalState>>(radio::Radio::EOperationalState::EOperationalState_Disabled)
}
};
std::cout << std::boolalpha << "2. All radios:" << std::endl;
radio::printMap(m);
std::cout << std::endl;
radio::eraseDisabledRadios(m);
std::cout << "3. All enabled radios:" << std::endl;
radio::printMap(m);
std::cout << std::endl;
std::vector<std::string> operationalRadios;
radio::fillWithUniqueRadioNames(m, operationalRadios);
std::cout << "4. Nr. of unique enabled radios: " << operationalRadios.size() << std::endl;
radio::printVec(operationalRadios);
std::cout << std::endl;
return 0;
}