Blk allocate(size_t n) {
   auto n1 = roundToAligned(n, align);
   if ((m_top - m_mem) + n1 > s) {
     return {nullptr, 0};
   }
   Blk r = {m_top, n};
   m_top += n1;
   return r;
 }
 AllocatorBlock allocate(size_t n) {
     auto n1 = roundToAligned(n);
     if (n1 > d_ + s - p_) {
         return {nullptr, 0};
     }
     AllocatorBlock result = {p_, n};
     p_ += n1;
     return result;
 }
 void deallocate(Blk blk) {
   if ((char *)blk.ptr + roundToAligned(blk.size, align) == m_top) {
     m_top = (char *)blk.ptr;
   }
 }
 void deallocate(AllocatorBlock b) {
     if ((char*)b.ptr + roundToAligned(b.length) == p_) {
         p_ = (char*)b.ptr;
     }
 }