shapes.tcc 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #ifndef __SHAPES_TCC__
  2. #define __SHAPES_TCC__
  3. // Constructor for the Pad shape.
  4. template <typename T>
  5. Duoram<T>::Pad::Pad(Shape &parent, MPCTIO &tio, yield_t &yield,
  6. address_t padded_size, size_t padval) :
  7. Shape(parent, parent.duoram, tio, yield)
  8. {
  9. int player = tio.player();
  10. padvalp = new T;
  11. padvalp->set(player*padval);
  12. zerop = new T;
  13. peerpadvalp = new T;
  14. peerpadvalp->set((1-player)*padval);
  15. this->set_shape_size(padded_size);
  16. }
  17. // Copy the given Pad except for the tio and yield
  18. template <typename T>
  19. Duoram<T>::Pad::Pad(const Pad &copy_from, MPCTIO &tio, yield_t &yield) :
  20. Shape(copy_from, tio, yield)
  21. {
  22. padvalp = new T;
  23. padvalp->set(copy_from.padvalp->share());
  24. zerop = new T;
  25. peerpadvalp = new T;
  26. peerpadvalp->set(copy_from.peerpadvalp->share());
  27. }
  28. // Destructor
  29. template <typename T>
  30. Duoram<T>::Pad::~Pad()
  31. {
  32. delete padvalp;
  33. delete zerop;
  34. delete peerpadvalp;
  35. }
  36. // Constructor for the Stride shape.
  37. template <typename T>
  38. Duoram<T>::Stride::Stride(Shape &parent, MPCTIO &tio, yield_t &yield,
  39. size_t offset, size_t stride) :
  40. Shape(parent, parent.duoram, tio, yield)
  41. {
  42. size_t parentsize = parent.size();
  43. if (offset > parentsize) {
  44. offset = parentsize;
  45. }
  46. this->offset = offset;
  47. this->stride = stride;
  48. // How many items are there if you take every stride'th item,
  49. // starting at offset? strideregionsize corrects for the offset, so
  50. // we're asking how many multiples of stride are there strictly less
  51. // than strideregionsize. That's just ceil(strideregionsize/stride)
  52. // which is the same as (strideregionsize + stride - 1)/stride with
  53. // integer truncated division.
  54. size_t strideregionsize = parentsize - offset;
  55. size_t numelements = (strideregionsize + stride - 1) / stride;
  56. this->set_shape_size(numelements);
  57. }
  58. #endif