fork(19) download
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <deque>
  4. #include <stdarg.h>
  5. template<typename T> class UFlag {
  6.  
  7. public:
  8. UFlag(){}
  9. UFlag(int n, ...){
  10. va_list args;
  11. va_start(args, n);
  12. for(int i = 0; i < n; ++i){
  13. T t = va_arg(args, T);
  14. list.push_back(t);
  15. }
  16. va_end(args);
  17. }
  18.  
  19. explicit operator bool() const {
  20. return list.size();
  21. }
  22.  
  23. inline UFlag<T>& operator |(T b){
  24. list.push_back(b);
  25. return *this;
  26. }
  27.  
  28. inline UFlag<T>& operator |(UFlag<T> b){
  29. for(const T& t : b.list)
  30. list.push_back(t);
  31. return *this;
  32. }
  33.  
  34. inline UFlag<T>& operator &(T n){
  35. UFlag<T> uf; uf | n;
  36. return *this & uf;
  37. }
  38.  
  39. inline UFlag<T>& operator &(UFlag<T> b){
  40. //if(list.size() == 0) return *(&b);
  41. if(b.list.size() == 0) return *this;
  42. UFlag<T> *uf = new UFlag<T>();
  43. for(T& t : b.list){
  44. if(std::find(list.begin(), list.end(), t) != list.end()) uf->list.push_back(t);
  45. }
  46. return *uf;
  47. }
  48.  
  49. void cout(){
  50. std::cout << "cout: ";
  51. for(const auto& i : list)
  52. std::cout << i << ", ";
  53. std::cout << std::endl;
  54. }
  55.  
  56. private:
  57. std::deque<T> list;
  58. };
  59.  
  60.  
  61. using namespace std;
  62.  
  63. int main()
  64. {
  65. cout << "Starting" << endl;
  66. UFlag<int> uf;
  67. (uf | 10) | 5;
  68. uf.cout();
  69.  
  70. UFlag<int> uf2;
  71. uf2 | 55 | 66;
  72. uf2.cout();
  73.  
  74.  
  75. uf | uf2;
  76. uf.cout();
  77.  
  78. UFlag<int> uf3;
  79. uf3 | 0 | 7 | -5;
  80. uf3.cout();
  81.  
  82. UFlag<int> uf4 = uf & uf3;
  83. uf4.cout();
  84.  
  85. if(uf & uf3) std::cout << "Contains" << std::endl;
  86. uf3 | 66 | 10;
  87. if(uf & uf3) std::cout << "2: Contains" << std::endl;
  88.  
  89. UFlag<int> uf5(3, 5, 6, 90);
  90. uf5.cout();
  91.  
  92. UFlag<int> uf6;
  93. UFlag<int> uf7(3, 4, 5, 6);
  94. (uf6 & uf7).cout();
  95. (uf7 & uf6).cout();
  96. return 0;
  97. }
  98.  
  99.  
Success #stdin #stdout 0s 3468KB
stdin
Standard input is empty
stdout
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,