#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <vector>
#include <list>
#include <functional>
#include <memory>
struct Son {
// some data that we want to point to
~Son(){printf("Bye Son\n");}
};
struct Father {
Son son;
Father(){}
~Father(){printf("Bye Father\n");}
};
int main(){
std::shared_ptr<Father> father = std::make_shared<Father>();
std::shared_ptr<Son> son(father, &father->son);
printf("%d\n", father.use_count());
printf("%d\n", son.use_count());
father.reset();
printf("%d\n", father.use_count());
printf("%d\n", son.use_count());
printf("%d\n", father.owner_before(son));
printf("%d\n", son.owner_before(father));
}
CgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxjc3RkaW8+CiNpbmNsdWRlIDxjc3RkbGliPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxsaXN0PgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPG1lbW9yeT4KCnN0cnVjdCBTb24gewogICAgLy8gc29tZSBkYXRhIHRoYXQgd2Ugd2FudCB0byBwb2ludCB0bwogICAgflNvbigpe3ByaW50ZigiQnllIFNvblxuIik7fQp9OwoKc3RydWN0IEZhdGhlciB7CiAgICBTb24gc29uOwogICAgRmF0aGVyKCl7fQogICAgfkZhdGhlcigpe3ByaW50ZigiQnllIEZhdGhlclxuIik7fQp9OwoKaW50IG1haW4oKXsKICAgIHN0ZDo6c2hhcmVkX3B0cjxGYXRoZXI+IGZhdGhlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8RmF0aGVyPigpOwogICAgc3RkOjpzaGFyZWRfcHRyPFNvbj4gc29uKGZhdGhlciwgJmZhdGhlci0+c29uKTsKICAgIHByaW50ZigiJWRcbiIsIGZhdGhlci51c2VfY291bnQoKSk7CiAgICBwcmludGYoIiVkXG4iLCBzb24udXNlX2NvdW50KCkpOwogICAgZmF0aGVyLnJlc2V0KCk7CiAgICBwcmludGYoIiVkXG4iLCBmYXRoZXIudXNlX2NvdW50KCkpOwogICAgcHJpbnRmKCIlZFxuIiwgc29uLnVzZV9jb3VudCgpKTsKICAgIHByaW50ZigiJWRcbiIsIGZhdGhlci5vd25lcl9iZWZvcmUoc29uKSk7CiAgICBwcmludGYoIiVkXG4iLCBzb24ub3duZXJfYmVmb3JlKGZhdGhlcikpOwp9Cg==