21 Ağustos 2017 Pazartesi

Gömülü Proje - ArraySegment

Giriş
Gömülü projelerde C#'taki ArraySegment sınıfına benzer bir sınıf çok işe yarıyor. Gereksiz kopyalama yapmadan bir bellek alanının başını ve sonunu tek bir nesne halinde geçebiliyoruz.

Eğer C++20 kullanıyorsak std::span sınıfını kullanmak daha iyi

Örnek
Şöyle yaparız.
template<class T>
struct span_t {
  T* b =0;
  T* e =0;
  T* begin() const { return b; }
  T* end() const { return e; }
  std::size_t size() const { return end()-begin(); }
  bool empty() const { return size()==0; }
  T& operator[](std::size_t i) const { return b[i]; }
  span_t()=default;
  span_t(span_t const&)=default;
  span_t& operator=(span_t const&)=default;
  span_t( T* s, T* f ):b(s),e(f) {}
  span_t( T* s, std::size_t l):span_t(s, s+l) {}
};
Örnek
Şöyle yaparız.
#include <cstdint>

template<typename T>
class array_view {
   T* ptr_;
   std::size_t len_;
public:
   array_view(T* ptr, std::size_t len) noexcept: ptr_{ptr}, len_{len} {}

   T& operator[](int i) noexcept { return ptr_[i]; }
   T const& operator[](int i) const noexcept { return ptr_[i]; }
   auto size() const noexcept { return len_; }

   auto begin() noexcept { return ptr_; }
   auto end() noexcept { return ptr_ + len_; }
};
Örnek
Şöyle yaparız.
template<typename T>
class span {
   T* ptr_;
   std::size_t len_;

public:
  span(T* ptr, std::size_t len) noexcept
    : ptr_{ptr}, len_{len}
  {}

  T& operator[](int i) noexcept {
    return *ptr_[i];
  }

  T const& operator[](int i) const noexcept {
    return *ptr_[i];
  }

  std::size_t size() const noexcept {
    return len_;
  }

  T* begin() noexcept {
    return ptr_;
  }

  T* end() noexcept {
    return ptr_ + len_;
  }
};


Hiç yorum yok:

Yorum Gönder