#include <memory>
#include <utility>
#include <string>
#include <cassert>
enum GLenum { foo };
// this class doesn't have any default, copy constructors.
struct Dep
{
Dep(std::string path, GLenum type) {}
Dep() = delete;
Dep(Dep const&) = delete;
};
struct Program
{
std::shared_ptr<Dep> dep1;
std::shared_ptr<Dep> dep2;
#if 1
template <class T, class = typename std::enable_if<std::is_constructible<std::shared_ptr<Dep>, T>::value>::type>
Program(T&& dep1, T&& dep2)
: dep1(std::forward<T>(dep1)), dep2(std::forward<T>(dep2))
{
}
#else
Program(std::shared_ptr<Dep> dep1, std::shared_ptr<Dep> dep2)
: dep1(std::move(dep1)), dep2(std::move(dep2))
{
}
#endif
};
int main()
{
auto dep1 = std::make_shared<Dep>("dep1", foo);
auto dep2 = std::make_shared<Dep>("dep2", foo);
Program p(std::move(dep1), std::move(dep2));
assert(!dep1 && !dep2);
}
I2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPHV0aWxpdHk+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxjYXNzZXJ0PgoKZW51bSBHTGVudW0geyBmb28gfTsKCi8vIHRoaXMgY2xhc3MgZG9lc24ndCBoYXZlIGFueSBkZWZhdWx0LCBjb3B5IGNvbnN0cnVjdG9ycy4Kc3RydWN0IERlcAp7CiAgICBEZXAoc3RkOjpzdHJpbmcgcGF0aCwgR0xlbnVtIHR5cGUpIHt9CiAgICBEZXAoKSA9IGRlbGV0ZTsKICAgIERlcChEZXAgY29uc3QmKSA9IGRlbGV0ZTsKfTsKCnN0cnVjdCBQcm9ncmFtCnsKICAgIHN0ZDo6c2hhcmVkX3B0cjxEZXA+IGRlcDE7CiAgICBzdGQ6OnNoYXJlZF9wdHI8RGVwPiBkZXAyOwoKI2lmIDEKICAgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxzdGQ6OnNoYXJlZF9wdHI8RGVwPiwgVD46OnZhbHVlPjo6dHlwZT4KICAgIFByb2dyYW0oVCYmIGRlcDEsIFQmJiBkZXAyKQogICAgICAgIDogZGVwMShzdGQ6OmZvcndhcmQ8VD4oZGVwMSkpLCBkZXAyKHN0ZDo6Zm9yd2FyZDxUPihkZXAyKSkKICAgIHsKICAgIH0KI2Vsc2UKICAgIFByb2dyYW0oc3RkOjpzaGFyZWRfcHRyPERlcD4gZGVwMSwgc3RkOjpzaGFyZWRfcHRyPERlcD4gZGVwMikKICAgICAgICA6IGRlcDEoc3RkOjptb3ZlKGRlcDEpKSwgZGVwMihzdGQ6Om1vdmUoZGVwMikpCiAgICB7CiAgICB9CiNlbmRpZgp9OwoKaW50IG1haW4oKQp7CiAgICBhdXRvIGRlcDEgPSBzdGQ6Om1ha2Vfc2hhcmVkPERlcD4oImRlcDEiLCBmb28pOwogICAgYXV0byBkZXAyID0gc3RkOjptYWtlX3NoYXJlZDxEZXA+KCJkZXAyIiwgZm9vKTsKICAgIFByb2dyYW0gcChzdGQ6Om1vdmUoZGVwMSksIHN0ZDo6bW92ZShkZXAyKSk7CgogICAgYXNzZXJ0KCFkZXAxICYmICFkZXAyKTsKfQoK