template <typename T>
T* dup(T* begin, T* end)
{
class mem_guard {
void *p;
public:
mem_guard(std::size_t n) { p = std::malloc(n*sizeof(T)); }
~mem_guard() { if (p) std::free(p); }
T* get() { return static_cast<T*>(p); }
T* release() { T *ptr=get(); p=0; return ptr; }
};
class unroll_guard {
T *start, *curr;
public:
unroll_guard(T *p) : start(p), curr(p) {}
~unroll_guard() { if (start) while (curr-- != start) curr->~T(); }
void emplace_back(T const& t) { new (curr) T(t); ++curr; }
void release() { start = 0; }
};
std::ptrdiff_t n = end - begin;
assert(n > 0);
// guard the memory
mem_guard memory(n);
if (!memory.get())
return 0;
// guard the items
unroll_guard data(memory.get());
for (; begin != end; ++begin)
data.emplace_back(*begin);
// everything ok, release the resources
data.release();
return memory.release();
}
dGVtcGxhdGUgPHR5cGVuYW1lIFQ+ClQqIGR1cChUKiBiZWdpbiwgVCogZW5kKQp7CiAgY2xhc3MgbWVtX2d1YXJkIHsKICAgIHZvaWQgKnA7CiAgcHVibGljOgogICAgbWVtX2d1YXJkKHN0ZDo6c2l6ZV90IG4pIHsgcCA9IHN0ZDo6bWFsbG9jKG4qc2l6ZW9mKFQpKTsgfQogICB+bWVtX2d1YXJkKCkgeyBpZiAocCkgc3RkOjpmcmVlKHApOyB9CiAgICAKICAgIFQqIGdldCgpICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxUKj4ocCk7IH0KICAgIFQqIHJlbGVhc2UoKSB7IFQgKnB0cj1nZXQoKTsgcD0wOyByZXR1cm4gcHRyOyB9CiAgfTsKCiAgY2xhc3MgdW5yb2xsX2d1YXJkIHsKICAgIFQgKnN0YXJ0LCAqY3VycjsKICBwdWJsaWM6CiAgICB1bnJvbGxfZ3VhcmQoVCAqcCkgOiBzdGFydChwKSwgY3VycihwKSB7fQogICB+dW5yb2xsX2d1YXJkKCkgeyBpZiAoc3RhcnQpIHdoaWxlIChjdXJyLS0gIT0gc3RhcnQpIGN1cnItPn5UKCk7IH0KICAgIHZvaWQgZW1wbGFjZV9iYWNrKFQgY29uc3QmIHQpIHsgbmV3IChjdXJyKSBUKHQpOyArK2N1cnI7IH0KICAgIHZvaWQgcmVsZWFzZSgpIHsgc3RhcnQgPSAwOyB9CiAgfTsKCiAgc3RkOjpwdHJkaWZmX3QgbiA9IGVuZCAtIGJlZ2luOwogIGFzc2VydChuID4gMCk7CgogIC8vIGd1YXJkIHRoZSBtZW1vcnkKICBtZW1fZ3VhcmQgbWVtb3J5KG4pOwogIGlmICghbWVtb3J5LmdldCgpKQogICAgcmV0dXJuIDA7CgogIC8vIGd1YXJkIHRoZSBpdGVtcwogIHVucm9sbF9ndWFyZCBkYXRhKG1lbW9yeS5nZXQoKSk7CiAgZm9yICg7IGJlZ2luICE9IGVuZDsgKytiZWdpbikKICAgIGRhdGEuZW1wbGFjZV9iYWNrKCpiZWdpbik7CgogIC8vIGV2ZXJ5dGhpbmcgb2ssIHJlbGVhc2UgdGhlIHJlc291cmNlcwogIGRhdGEucmVsZWFzZSgpOwogIHJldHVybiBtZW1vcnkucmVsZWFzZSgpOwp9Cg==