shapes.tcc 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #ifndef __SHAPES_TCC__
  2. #define __SHAPES_TCC__
  3. // Constructor for the Pad shape. The parent must _not_ be in
  4. // explicit-only mode.
  5. template <typename T>
  6. Duoram<T>::Pad::Pad(Shape &parent, MPCTIO &tio, yield_t &yield,
  7. address_t padded_size, size_t padval) :
  8. Shape(parent, parent.duoram, tio, yield)
  9. {
  10. int player = tio.player();
  11. padvalp = new T;
  12. padvalp->set(player*padval);
  13. zerop = new T;
  14. peerpadvalp = new T;
  15. peerpadvalp->set((1-player)*padval);
  16. this->set_shape_size(padded_size);
  17. }
  18. // Copy the given Pad except for the tio and yield
  19. template <typename T>
  20. Duoram<T>::Pad::Pad(const Pad &copy_from, MPCTIO &tio, yield_t &yield) :
  21. Shape(copy_from, tio, yield)
  22. {
  23. padvalp = new T;
  24. padvalp->set(copy_from.padvalp->share());
  25. zerop = new T;
  26. peerpadvalp = new T;
  27. peerpadvalp->set(copy_from.peerpadvalp->share());
  28. }
  29. // Destructor
  30. template <typename T>
  31. Duoram<T>::Pad::~Pad()
  32. {
  33. delete padvalp;
  34. delete zerop;
  35. delete peerpadvalp;
  36. }
  37. // Constructor for the Stride shape.
  38. template <typename T>
  39. Duoram<T>::Stride::Stride(Shape &parent, MPCTIO &tio, yield_t &yield,
  40. size_t offset, size_t stride) :
  41. Shape(parent, parent.duoram, tio, yield)
  42. {
  43. size_t parentsize = parent.size();
  44. if (offset > parentsize) {
  45. offset = parentsize;
  46. }
  47. this->offset = offset;
  48. this->stride = stride;
  49. // How many items are there if you take every stride'th item,
  50. // starting at offset? strideregionsize corrects for the offset, so
  51. // we're asking how many multiples of stride are there strictly less
  52. // than strideregionsize. That's just ceil(strideregionsize/stride)
  53. // which is the same as (strideregionsize + stride - 1)/stride with
  54. // integer truncated division.
  55. size_t strideregionsize = parentsize - offset;
  56. size_t numelements = (strideregionsize + stride - 1) / stride;
  57. this->set_shape_size(numelements);
  58. }
  59. // Constructor for the Path shape.
  60. template <typename T>
  61. Duoram<T>::Path::Path(Shape &parent, MPCTIO &tio, yield_t &yield,
  62. size_t target_node) :
  63. Shape(parent, parent.duoram, tio, yield)
  64. {
  65. size_t parentsize = parent.size();
  66. assert(target_node > 0 && target_node < parentsize);
  67. this->target_node = target_node;
  68. // How many nodes are there on the path from the root (index 1) to
  69. // the target node? Recall that the parent of the node at index x
  70. // is just the node at index (x>>1).
  71. size_t path_num_nodes = 1, cur_node = target_node;
  72. while (cur_node > 1) {
  73. cur_node >>= 1;
  74. ++path_num_nodes;
  75. }
  76. this->set_shape_size(path_num_nodes);
  77. }
  78. #endif