Advertisement
Guest User

Untitled

a guest
Nov 24th, 2014
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.23 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <cmath>
  5. #include <assert.h>
  6. #include <stdlib.h>
  7. #include <vector>
  8.  
  9. class Range {
  10.  private:
  11.     int begin_;
  12.     int end_;
  13.     int step_;
  14.     int size_;
  15.     int* data_;
  16.     bool up_;
  17.  
  18.  public:
  19. // Constructors
  20. // Constructor for 2 operands
  21.     Range(const int& begin, const int& end) {
  22.         begin_ = begin;
  23.         end_ = end;
  24.         step_ = 1;
  25.         size_ = std::abs(end_ - begin_);
  26.         data_ = new int[size_];
  27.         up_ = begin_ < end_;
  28.         int j = -1;
  29.         if ( up_ ) {
  30.             for ( int i = begin_; i < end_; i += step_ ) {
  31.                 j++;
  32.                 data_[j] = i;
  33.             }
  34.         } else {
  35.             for (int i = begin_; i > end_; i -= step_) {
  36.                 j++;
  37.                 data_[j] = i;
  38.             }
  39.         }
  40.     }
  41.  
  42. // Constructor for 1 operand
  43.     explicit Range(const int& end) {
  44.         int j = -1;
  45.         end_ = end;
  46.         begin_ = 0;
  47.         size_ = std::abs(end_);
  48.         data_ = new int[size_];
  49.         step_ = 1;
  50.         up_ = begin_ < end_;
  51.         if (up_) {
  52.             for (int i = begin_; i < end_; i += step_) {
  53.                 j++;
  54.                 data_[j] = i;
  55.             }
  56.         } else {
  57.             for (int i =  begin_;  i > end_; i -= step_) {
  58.                 j++;
  59.                 data_[j] = i;
  60.             }
  61.         }
  62.     }
  63.  
  64. // Constructor for 3 operands
  65.  
  66.     Range(const int& begin, const int& end, const int step) {
  67.         int j = -1;
  68.         begin_ = begin;
  69.         end_ = end;
  70.         step_ = step;
  71.         size_ = std::abs((std::abs(end_ - begin_)-1)/step_)+1;
  72.         data_ = new int[size_];
  73.         up_ = step_ > 0;
  74.         if (up_) {
  75.             for (int i = begin_;  i < end_;  i += step_) {
  76.                 j++;
  77.                 data_[j] = i;
  78.             }
  79.         } else {
  80.             for (int i = begin_;  i > end_;  i += step_) {
  81.                 j++;
  82.                 data_[j] = i;
  83.             }
  84.         }
  85.     }
  86.     // Creating Iterator class
  87.     class Iterator {
  88.      private:
  89.             int* data_begin_;
  90.             int size_;
  91.  
  92.      public:
  93.             Iterator(int* data_begin, int size)
  94.                 : data_begin_(data_begin), size_(size)
  95.             {}
  96.  
  97.             Iterator(Iterator &other) {
  98.                 size_ = other.size_;
  99.                 data_begin_ = other.data_begin_;
  100.               }
  101.             Iterator& operator ++() {
  102.                 assert(size_ > 0);
  103.  
  104.                 data_begin_++;
  105.                 size_ -= 1;
  106.                 return *this;
  107.             }
  108.             int& operator *() {
  109.                 return *data_begin_;
  110.             }
  111.             bool operator ==(Iterator &other) {
  112.                 if ((*data_begin_ == *other.data_begin_) && (size_ == other.size_)) {
  113.                     return true;
  114.                 } else {
  115.                     return false;
  116.                 }
  117.             }
  118.            bool operator !=(Iterator other) {
  119.                 return !(*this == other);
  120.             }
  121.  
  122.            Iterator operator =(Iterator other) {
  123.                 assert(size_ > 0);
  124.  
  125.                 if (this == &other) {
  126.                     return *this;
  127.                 }
  128.                 size_ = other.size_;
  129.                 data_begin_ = other.data_begin_;
  130.                 return *this;
  131.             }
  132.             Iterator(const Iterator &other) {
  133.             *data_begin_ = *other.data_begin_;
  134.             size_ = other.size_;
  135.         }
  136.     };
  137.     Iterator begin() {
  138.         return Iterator(data_, size_);
  139.     }
  140.  
  141.     Iterator end() {
  142.         return Iterator(data_ + size_, 0);
  143.     }
  144.     void out() {
  145.         for (Iterator it = begin(); it != end(); ++it) {
  146.             std::cout << *it <<std::endl;
  147.         }
  148.     }
  149. };
  150.  
  151. Range input_range() {
  152.     std::vector<int> in_vec(3);
  153.     int i = 0;
  154.     while (std::cin >> in_vec[i]) {
  155.        i++;
  156.     }
  157.     if ( i == 1 ) {
  158.         Range r = Range(in_vec[0]);
  159.         return r;
  160.     }
  161.  
  162.     if (i == 2) {
  163.         Range r = Range(in_vec[0], in_vec[1]);
  164.         return r;
  165.     }
  166.     if (i == 3) {
  167.         Range r = Range(in_vec[0], in_vec[1], in_vec[2]);
  168.         return r;
  169.     }
  170.     }
  171.  
  172. int main() {
  173.     input_range().out();
  174.     return 0;
  175. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement