#include <string>
//#include <cstdint> //Not needed;
#include <iostream>
#include <type_traits> //Not needed
#include <unordered_map>
/*
Declare a scoped enum Experiance, it's like old c++ enum but
compiller prevent cast to another types by default.
Sample:
Experiance exp = Experience::CPlusPlus11;
int32_t iErrCast = exp //compile error: invalid type cast.
int32_t iRightCast = static_cast<int32_t>( expr ) //Manual cast. it's ok
All this enum members is
*/
enum class Experience : uint8_t {
None = 0,
Linux = 1 << 0,
Multithreading = 1 << 1,
Socket = 1 << 2,
Highload = 1 << 3,
CPlusPlus11 = 1 << 4,
DataStructs = 1 << 5,
Patterns = 1 << 6,
Algorithms = 1 << 7,
All = UINT8_MAX
};
inline constexpr Experience operator|(Experience x, Experience y) {
return static_cast<Experience>(static_cast<uint8_t>(x) | static_cast<uint8_t>(y));
}
inline constexpr Experience operator&(Experience x, Experience y) {
return static_cast<Experience>(static_cast<uint8_t>(x) & static_cast<uint8_t>(y));
}
inline constexpr bool operator==(Experience x, Experience y) {
return static_cast<uint8_t>(x) == static_cast<uint8_t>(y);
}
template<Experience Mask>
struct Applicant {
static const bool value = ((Mask & Experience::All) == Experience::All);
};
template<typename T>
class Suitability {
template<typename U>
static int8_t f(typename std::enable_if<U::value, bool>::type*);
template<typename U>
static int32_t f(...);
public:
static const bool value = (sizeof(f<T>(0)) == sizeof(int8_t));
};
int main(int argc, const char * argv[]) {
std::unordered_map<uint8_t, std::string> result = { { 0, "Unsuitable" }, { 1, "Suitable" } };
static constexpr Experience experience = Experience::None; // specify your skills here
std::cout << result[Suitability<Applicant<experience>>::value] << std::endl;
return 0;
}
I2luY2x1ZGUgPHN0cmluZz4KLy8jaW5jbHVkZSA8Y3N0ZGludD4gLy9Ob3QgbmVlZGVkOwojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4gLy9Ob3QgbmVlZGVkCiNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgoKCi8qCglEZWNsYXJlIGEgc2NvcGVkIGVudW0gRXhwZXJpYW5jZSwgaXQncyBsaWtlIG9sZCBjKysgZW51bSBidXQKCWNvbXBpbGxlciBwcmV2ZW50IGNhc3QgdG8gYW5vdGhlciB0eXBlcyBieSBkZWZhdWx0LgoJU2FtcGxlOgoJRXhwZXJpYW5jZSBleHAgPSBFeHBlcmllbmNlOjpDUGx1c1BsdXMxMTsKCWludDMyX3QgaUVyckNhc3QgPSBleHAgLy9jb21waWxlIGVycm9yOiBpbnZhbGlkIHR5cGUgY2FzdC4KCWludDMyX3QgaVJpZ2h0Q2FzdCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KCBleHByICkgLy9NYW51YWwgY2FzdC4gaXQncyBvawoJCglBbGwgdGhpcyBlbnVtIG1lbWJlcnMgaXMgCiovCmVudW0gY2xhc3MgRXhwZXJpZW5jZSA6IHVpbnQ4X3QgIHsKCU5vbmUgPSAwLAoJTGludXggPSAxIDw8IDAsCglNdWx0aXRocmVhZGluZyA9IDEgPDwgMSwKCVNvY2tldCA9IDEgPDwgMiwKCUhpZ2hsb2FkID0gMSA8PCAzLAoJQ1BsdXNQbHVzMTEgPSAxIDw8IDQsCglEYXRhU3RydWN0cyA9IDEgPDwgNSwKCVBhdHRlcm5zID0gMSA8PCA2LAoJQWxnb3JpdGhtcyA9IDEgPDwgNywKCUFsbCA9IFVJTlQ4X01BWAp9OwoKaW5saW5lIGNvbnN0ZXhwciBFeHBlcmllbmNlIG9wZXJhdG9yfChFeHBlcmllbmNlIHgsIEV4cGVyaWVuY2UgeSkgewoJcmV0dXJuIHN0YXRpY19jYXN0PEV4cGVyaWVuY2U+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHgpIHwgc3RhdGljX2Nhc3Q8dWludDhfdD4oeSkpOwp9CgppbmxpbmUgY29uc3RleHByIEV4cGVyaWVuY2Ugb3BlcmF0b3ImKEV4cGVyaWVuY2UgeCwgRXhwZXJpZW5jZSB5KSB7CglyZXR1cm4gc3RhdGljX2Nhc3Q8RXhwZXJpZW5jZT4oc3RhdGljX2Nhc3Q8dWludDhfdD4oeCkgJiBzdGF0aWNfY2FzdDx1aW50OF90Pih5KSk7Cn0KCmlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj09KEV4cGVyaWVuY2UgeCwgRXhwZXJpZW5jZSB5KSB7CglyZXR1cm4gc3RhdGljX2Nhc3Q8dWludDhfdD4oeCkgPT0gc3RhdGljX2Nhc3Q8dWludDhfdD4oeSk7Cn0KCnRlbXBsYXRlPEV4cGVyaWVuY2UgTWFzaz4Kc3RydWN0IEFwcGxpY2FudCB7CglzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9ICgoTWFzayAmIEV4cGVyaWVuY2U6OkFsbCkgPT0gRXhwZXJpZW5jZTo6QWxsKTsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIFN1aXRhYmlsaXR5IHsKCXRlbXBsYXRlPHR5cGVuYW1lIFU+CglzdGF0aWMgaW50OF90IGYodHlwZW5hbWUgc3RkOjplbmFibGVfaWY8VTo6dmFsdWUsIGJvb2w+Ojp0eXBlKik7CgkKCXRlbXBsYXRlPHR5cGVuYW1lIFU+CglzdGF0aWMgaW50MzJfdCBmKC4uLik7CgkKcHVibGljOgoJc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSAoc2l6ZW9mKGY8VD4oMCkpID09IHNpemVvZihpbnQ4X3QpKTsKfTsKCmludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICogYXJndltdKSB7CglzdGQ6OnVub3JkZXJlZF9tYXA8dWludDhfdCwgc3RkOjpzdHJpbmc+IHJlc3VsdCA9IHsgeyAwLCAiVW5zdWl0YWJsZSIgfSwgeyAxLCAiU3VpdGFibGUiIH0gfTsKCXN0YXRpYyBjb25zdGV4cHIgRXhwZXJpZW5jZSBleHBlcmllbmNlID0gRXhwZXJpZW5jZTo6Tm9uZTsgLy8gc3BlY2lmeSB5b3VyIHNraWxscyBoZXJlCglzdGQ6OmNvdXQgPDwgcmVzdWx0W1N1aXRhYmlsaXR5PEFwcGxpY2FudDxleHBlcmllbmNlPj46OnZhbHVlXSA8PCBzdGQ6OmVuZGw7CiAgICByZXR1cm4gMDsKfQ==