obj.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include "pocketpy/obj.h"
  2. namespace pkpy{
  3. PyObject::~PyObject() {
  4. if(_attr == nullptr) return;
  5. _attr->~NameDict();
  6. pool128_dealloc(_attr);
  7. }
  8. bool Bytes::operator==(const Bytes& rhs) const{
  9. if(_size != rhs._size) return false;
  10. for(int i=0; i<_size; i++) if(_data[i] != rhs._data[i]) return false;
  11. return true;
  12. }
  13. bool Bytes::operator!=(const Bytes& rhs) const{ return !(*this == rhs); }
  14. Bytes::Bytes(const std::vector<unsigned char>& v){
  15. _data = new unsigned char[v.size()];
  16. _size = v.size();
  17. for(int i=0; i<_size; i++) _data[i] = v[i];
  18. }
  19. Bytes::Bytes(std::string_view sv){
  20. _data = new unsigned char[sv.size()];
  21. _size = sv.size();
  22. for(int i=0; i<_size; i++) _data[i] = sv[i];
  23. }
  24. // copy constructor
  25. Bytes::Bytes(const Bytes& rhs){
  26. _data = new unsigned char[rhs._size];
  27. _size = rhs._size;
  28. for(int i=0; i<_size; i++) _data[i] = rhs._data[i];
  29. }
  30. // move constructor
  31. Bytes::Bytes(Bytes&& rhs) noexcept {
  32. _data = rhs._data;
  33. _size = rhs._size;
  34. rhs._data = nullptr;
  35. rhs._size = 0;
  36. }
  37. // move assignment
  38. Bytes& Bytes::operator=(Bytes&& rhs) noexcept {
  39. delete[] _data;
  40. _data = rhs._data;
  41. _size = rhs._size;
  42. rhs._data = nullptr;
  43. rhs._size = 0;
  44. return *this;
  45. }
  46. std::pair<unsigned char*, int> Bytes::detach() noexcept {
  47. unsigned char* p = _data;
  48. int size = _size;
  49. _data = nullptr;
  50. _size = 0;
  51. return {p, size};
  52. }
  53. } // namespace pkpy