Advertisement
Guest User

Untitled

a guest
May 26th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.94 KB | None | 0 0
  1. //main.cpp
  2. #include <iostream>
  3. #include "numseq.h"
  4.  
  5. using namespace std;
  6. int main() {
  7.     int y[10]={1,2,4,7,17,32,64,127,200,228};
  8.     NumSeq<int> x(y,y+5);
  9.     for (auto z:x){
  10.         cout << z << endl;
  11.     }
  12.     for (auto it=x.begin();it!=x.end();++it){
  13.         *it=2;
  14.     }
  15.     for (auto z:x){
  16.         cout << z << endl;
  17.     }
  18.     for (int i=0;i<5;++i){
  19.         cout << x[i] << endl;
  20.     }
  21.     return 0;
  22. }
  23.  
  24.  
  25.  
  26. //numseq.hpp
  27. #include <vector>
  28. #include <iterator>
  29.  
  30. using namespace std;
  31.  
  32. template<class T>
  33. class BitIterator;
  34.  
  35. template<class T>
  36. class Number;
  37.  
  38. template<class T>
  39. class NumSeq {
  40. private:
  41.     vector<T> seq;
  42.  
  43.     friend class Number<T>;
  44.  
  45.     friend class BitIterator<T>;
  46.  
  47. public:
  48.     BitIterator<T> begin();
  49.  
  50.     BitIterator<T> end();
  51.  
  52.     T &operator[](int i);
  53.  
  54.     NumSeq();
  55.  
  56.     template<typename _InputIterator,
  57.             typename = std::_RequireInputIter<_InputIterator>>
  58.     NumSeq(_InputIterator first, _InputIterator last): seq(first, last) {}
  59. };
  60.  
  61. template<class T>
  62. BitIterator<T> NumSeq<T>::begin() {
  63.     return BitIterator<T>(this);
  64. }
  65.  
  66. template<class T>
  67. BitIterator<T> NumSeq<T>::end() {
  68.     return BitIterator<T>(this, seq.size());
  69. }
  70.  
  71. template<class T>
  72. T &NumSeq<T>::operator[](int i) {
  73.     return seq[i];
  74. }
  75.  
  76. template<class T>
  77. class Number {
  78. private:
  79.     NumSeq<T> *seq;
  80.     int pos, bits;
  81. public:
  82.     Number(NumSeq<T> *seq, int pos);
  83.  
  84.     Number<T> &operator=(int x);
  85.  
  86.     Number<T> &operator=(const Number<T> &x);
  87.  
  88.     operator int();
  89. };
  90.  
  91. template<class T>
  92. Number<T>::operator int() {
  93.     for (int i = 0, size = sizeof(T) * 8, x = seq->seq[pos]; i < size && x != 0; ++i) {
  94.         if (x & 1) ++this->bits;
  95.         x >>= 1;
  96.     }
  97.     return bits;
  98. }
  99.  
  100. template<class T>
  101. Number<T>::Number(NumSeq<T> *seq, int pos) {
  102.     this->seq = seq;
  103.     this->pos = pos;
  104.     this->bits = 0;
  105. }
  106.  
  107. template<class T>
  108. Number<T> &Number<T>::operator=(int x) {
  109.     if (x > sizeof(T) * 8) {
  110.         throw "you want too much bits, подумой";
  111.     }
  112.     this->bits = int(*this);
  113.     if (x > bits) {
  114.         T y = (T) 1;
  115.         for (int diff = x - bits, num = seq->seq[pos]; diff; y <<= 1, num >>= 1) {
  116.             if (!(num & 1)) {
  117.                 seq->seq[pos] |= y;
  118.                 --diff;
  119.             }
  120.         }
  121.     } else if (bits > x) {
  122.         T y = (T) 1;
  123.         for (int diff = bits - x, num = seq->seq[pos]; diff; y <<= 1, num >>= 1) {
  124.             if (num & 1) {
  125.                 seq->seq[pos] ^= y;
  126.                 --diff;
  127.             }
  128.         }
  129.     }
  130.     this->bits = x;
  131.     return *this;
  132. }
  133.  
  134. template<class T>
  135. Number<T> &Number<T>::operator=(const Number<T> &x) {
  136.     *this = (int) x;
  137.     return *this;
  138. }
  139.  
  140. template<class T>
  141. class BitIterator : public iterator<forward_iterator_tag, int, ptrdiff_t, Number<T> *, Number<T> > {
  142. private:
  143.     NumSeq<T> *seq;
  144.     int pos;
  145.     bool is_default;
  146.  
  147.     bool is_end() const { return pos > seq->seq.size(); }
  148.  
  149. public:
  150.     BitIterator() : is_default(true) {};
  151.  
  152.     BitIterator(NumSeq<T> *seq, int pos) : seq(seq), is_default(false), pos(pos) {}
  153.  
  154.     BitIterator(NumSeq<T> *seq) : BitIterator(seq, 0) {}
  155.  
  156.     bool operator==(const BitIterator<T> &y) const {
  157.         return (is_default && y.is_default) ||
  158.                (is_default && y.is_end()) ||
  159.                (is_end() && y.is_default) ||
  160.                (seq == y.seq && pos == y.pos);
  161.     }
  162.  
  163.     bool operator!=(const BitIterator<T> &y) const {
  164.         return !(*this == y);
  165.     }
  166.  
  167.     Number<T> operator*() {
  168.         if (is_default) {
  169.             throw "i don't like this iterator, sorry";
  170.         }
  171.         return Number<T>(seq, pos);
  172.     }
  173.  
  174.     BitIterator<T> &operator++() {
  175.         if (is_default) {
  176.             throw "i don't like this iterator, sorry";
  177.         }
  178.         ++pos;
  179.         return *this;
  180.     };
  181.  
  182.     BitIterator<T> &operator++(int) {
  183.         BitIterator copy(*this);
  184.         operator++();
  185.         return copy;
  186.     };
  187. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement