+template <typename Container>
+struct Emplace {
+ Emplace(Container& c, typename Container::iterator i)
+ : container(std::addressof(c)), iter(std::move(i)) {}
+ template <typename... Args>
+ void emplace(Args&&... args) {
+ iter = container->emplace(iter, std::forward<Args>(args)...);
+ ++iter;
+ }
+ Container* container;
+ typename Container::iterator iter;
+};
+
+/**
+ * Emplace implementation class for folly::hint_emplace_iterator.
+ */
+template <typename Container>
+struct EmplaceHint {
+ EmplaceHint(Container& c, typename Container::iterator i)
+ : container(std::addressof(c)), iter(std::move(i)) {}
+ template <typename... Args>
+ void emplace(Args&&... args) {
+ iter = container->emplace_hint(iter, std::forward<Args>(args)...);
+ ++iter;
+ }
+ Container* container;
+ typename Container::iterator iter;
+};
+
+/**
+ * Emplace implementation class for folly::front_emplace_iterator.
+ */
+template <typename Container>
+struct EmplaceFront {
+ explicit EmplaceFront(Container& c) : container(std::addressof(c)) {}
+ template <typename... Args>
+ void emplace(Args&&... args) {
+ container->emplace_front(std::forward<Args>(args)...);
+ }
+ Container* container;
+};
+
+/**
+ * Emplace implementation class for folly::back_emplace_iterator.
+ */
+template <typename Container>
+struct EmplaceBack {
+ explicit EmplaceBack(Container& c) : container(std::addressof(c)) {}
+ template <typename... Args>
+ void emplace(Args&&... args) {
+ container->emplace_back(std::forward<Args>(args)...);
+ }
+ Container* container;
+};
+
+/**
+ * Generic base class and implementation of all emplace iterator classes.
+ *
+ * Uses the curiously recurring template pattern (CRTP) to cast `this*` to
+ * `Derived*`; i.e., to implement covariant return types in a generic manner.
+ */
+template <typename Derived, typename EmplaceImpl, bool implicit_unpack>