Mikki0

Untitled

Sep 16th, 2021
656
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #pragma once
  2.  
  3. struct State {
  4.     int ref_count;
  5.     std::vector<std::string> vec;
  6. };
  7.  
  8. class COWVector {
  9. public:
  10.     COWVector() {
  11.         state_ = std::shared_ptr<State>(new State);
  12.         ++(state_->ref_count);
  13.     }
  14.     ~COWVector() {
  15.         --(state_->ref_count);
  16.         if (state_->ref_count == 0) {
  17.             state_.reset();
  18.         }
  19.     }
  20.  
  21.     COWVector(const COWVector& other) {
  22.         state_ = other.state_;
  23.         ++(state_->ref_count);
  24.     }
  25.     COWVector& operator=(const COWVector& other) {
  26.         --(state_->ref_count);
  27.         state_ = other.state_;
  28.         ++(state_->ref_count);
  29.         return *this;
  30.     }
  31.  
  32.     void SmartCopy() {
  33.         if (state_->ref_count > 1) {
  34.             std::vector<std::string> temp(state_->vec);
  35.             --(state_->ref_count);
  36.             state_ = std::shared_ptr<State>(new State);
  37.             ++(state_->ref_count);
  38.             state_->vec = temp;
  39.         }
  40.     }
  41.  
  42.     size_t Size() const {
  43.         return state_->vec.size();
  44.     }
  45.  
  46.     void Resize(size_t size) {
  47.         SmartCopy();
  48.         state_->vec.resize(size);
  49.     }
  50.  
  51.     const std::string& Get(size_t at) {
  52.         return state_->vec.at(at);
  53.     }
  54.     const std::string& Back() {
  55.         return state_->vec.back();
  56.     }
  57.  
  58.     void PushBack(const std::string& value) {
  59.         SmartCopy();
  60.         state_->vec.push_back(value);
  61.     }
  62.  
  63.     void Set(size_t at, const std::string& value) {
  64.         SmartCopy();
  65.         state_->vec[at] = value;
  66.     }
  67.  
  68. private:
  69.     std::shared_ptr<State> state_;
  70. };
RAW Paste Data