#include <iostream>
#include <algorithm>
#include <deque>
#include <stdarg.h>
template<typename T> class UFlag {
public:
UFlag(){}
UFlag(int n, ...){
va_list args;
va_start(args, n);
for(int i = 0; i < n; ++i){
T t = va_arg(args, T);
list.push_back(t);
}
va_end(args);
}
explicit operator bool() const {
return list.size();
}
inline UFlag<T>& operator |(T b){
list.push_back(b);
return *this;
}
inline UFlag<T>& operator |(UFlag<T> b){
for(const T& t : b.list)
list.push_back(t);
return *this;
}
inline UFlag<T>& operator &(T n){
UFlag<T> uf; uf | n;
return *this & uf;
}
inline UFlag<T>& operator &(UFlag<T> b){
//if(list.size() == 0) return *(&b);
if(b.list.size() == 0) return *this;
UFlag<T> *uf = new UFlag<T>();
for(T& t : b.list){
if(std::find(list.begin(), list.end(), t) != list.end()) uf->list.push_back(t);
}
return *uf;
}
void cout(){
std::cout << "cout: ";
for(const auto& i : list)
std::cout << i << ", ";
std::cout << std::endl;
}
private:
std::deque<T> list;
};
using namespace std;
int main()
{
cout << "Starting" << endl;
UFlag<int> uf;
(uf | 10) | 5;
uf.cout();
UFlag<int> uf2;
uf2 | 55 | 66;
uf2.cout();
uf | uf2;
uf.cout();
UFlag<int> uf3;
uf3 | 0 | 7 | -5;
uf3.cout();
UFlag<int> uf4 = uf & uf3;
uf4.cout();
if(uf & uf3) std::cout << "Contains" << std::endl;
uf3 | 66 | 10;
if(uf & uf3) std::cout << "2: Contains" << std::endl;
UFlag<int> uf5(3, 5, 6, 90);
uf5.cout();
UFlag<int> uf6;
UFlag<int> uf7(3, 4, 5, 6);
(uf6 & uf7).cout();
(uf7 & uf6).cout();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8ZGVxdWU+CiNpbmNsdWRlIDxzdGRhcmcuaD4KdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgVUZsYWcgewoKcHVibGljOgoJVUZsYWcoKXt9CglVRmxhZyhpbnQgbiwgLi4uKXsKCQl2YV9saXN0IGFyZ3M7CgkJdmFfc3RhcnQoYXJncywgbik7CgkJZm9yKGludCBpID0gMDsgaSA8IG47ICsraSl7CgkJCVQgdCA9IHZhX2FyZyhhcmdzLCBUKTsKCQkJbGlzdC5wdXNoX2JhY2sodCk7CgkJfQoJCXZhX2VuZChhcmdzKTsKCX0KCiAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgewogICAgICAgIHJldHVybiBsaXN0LnNpemUoKTsKICAgIH0KCglpbmxpbmUgVUZsYWc8VD4mIG9wZXJhdG9yIHwoVCBiKXsKCSAgICBsaXN0LnB1c2hfYmFjayhiKTsKCQlyZXR1cm4gKnRoaXM7Cgl9CgkKCWlubGluZSBVRmxhZzxUPiYgb3BlcmF0b3IgfChVRmxhZzxUPiBiKXsKCSAgICBmb3IoY29uc3QgVCYgdCA6IGIubGlzdCkKCSAgICAgICAgbGlzdC5wdXNoX2JhY2sodCk7CgkJcmV0dXJuICp0aGlzOwoJfQoJCglpbmxpbmUgVUZsYWc8VD4mIG9wZXJhdG9yICYoVCBuKXsKCSAgICBVRmxhZzxUPiB1ZjsgdWYgfCBuOwoJICAgIHJldHVybiAqdGhpcyAmIHVmOwoJfQoJCglpbmxpbmUgVUZsYWc8VD4mIG9wZXJhdG9yICYoVUZsYWc8VD4gYil7CgkJLy9pZihsaXN0LnNpemUoKSA9PSAwKSByZXR1cm4gKigmYik7CgkJaWYoYi5saXN0LnNpemUoKSA9PSAwKSByZXR1cm4gKnRoaXM7CgkgICAgVUZsYWc8VD4gKnVmID0gbmV3IFVGbGFnPFQ+KCk7CgkgICAgZm9yKFQmIHQgOiBiLmxpc3QpewoJICAgICAgICBpZihzdGQ6OmZpbmQobGlzdC5iZWdpbigpLCBsaXN0LmVuZCgpLCB0KSAhPSBsaXN0LmVuZCgpKSB1Zi0+bGlzdC5wdXNoX2JhY2sodCk7CgkgICAgfQoJICAgIHJldHVybiAqdWY7Cgl9CgkKCXZvaWQgY291dCgpewoJICAgIHN0ZDo6Y291dCA8PCAiY291dDogIjsKCSAgICBmb3IoY29uc3QgYXV0byYgaSA6IGxpc3QpCgkgICAgICAgIHN0ZDo6Y291dCA8PCBpIDw8ICIsICI7CgkgICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKCX0KCnByaXZhdGU6CglzdGQ6OmRlcXVlPFQ+IGxpc3Q7Cn07CgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBtYWluKCkKewogICAgY291dCA8PCAiU3RhcnRpbmciIDw8IGVuZGw7CiAgIFVGbGFnPGludD4gdWY7CiAgICh1ZiB8IDEwKSB8IDU7CiAgIHVmLmNvdXQoKTsKICAgCiAgIFVGbGFnPGludD4gdWYyOwogICB1ZjIgfCA1NSB8IDY2OwogICB1ZjIuY291dCgpOwogICAKICAgCiAgIHVmIHwgdWYyOwogICB1Zi5jb3V0KCk7CiAgIAogICBVRmxhZzxpbnQ+IHVmMzsKICAgdWYzIHwgMCB8IDcgfCAtNTsKICAgdWYzLmNvdXQoKTsKICAgCiAgIFVGbGFnPGludD4gdWY0ID0gdWYgJiB1ZjM7CiAgIHVmNC5jb3V0KCk7CiAgIAogICBpZih1ZiAmIHVmMykgc3RkOjpjb3V0IDw8ICJDb250YWlucyIgPDwgc3RkOjplbmRsOwogICB1ZjMgfCA2NiB8IDEwOwogICBpZih1ZiAmIHVmMykgc3RkOjpjb3V0IDw8ICIyOiBDb250YWlucyIgPDwgc3RkOjplbmRsOwogICAKICAgVUZsYWc8aW50PiB1ZjUoMywgNSwgNiwgOTApOwogICB1ZjUuY291dCgpOwogICAKICAgVUZsYWc8aW50PiB1ZjY7CiAgIFVGbGFnPGludD4gdWY3KDMsIDQsIDUsIDYpOwogICAodWY2ICYgdWY3KS5jb3V0KCk7CiAgICh1ZjcgJiB1ZjYpLmNvdXQoKTsKICAgcmV0dXJuIDA7Cn0KCg==
Starting
cout: 10, 5,
cout: 55, 66,
cout: 10, 5, 55, 66,
cout: 0, 7, -5,
cout:
2: Contains
cout: 5, 6, 90,
cout:
cout: 4, 5, 6,