Added folly::hint_emplace_iterator to folly/Iterator.h
authorPhilipp Unterbrunner <philippu@fb.com>
Sat, 27 May 2017 05:54:46 +0000 (22:54 -0700)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Sat, 27 May 2017 06:37:37 +0000 (23:37 -0700)
commit719b2df9d1996283acaac1d13476bcbc7da42154
tree0ab3846bfeaccfcab38d771279ba80d7c7baa479
parenta7001e5c7a9b53fb61ccec900f6f43d66c597d82
Added folly::hint_emplace_iterator to folly/Iterator.h

Summary:
In contrast to Container::insert(), for any STL container class, Container::emplace() does not have an overload that takes a Container::iterator as its first parameter. (The reason is to prevent ambiguity with respect to target class constructor parameters.) Instead, container classes have a separate emplace_hint() function.
Because of this separation, folly::emplace_iterator would fail to perform hinted emplacement in constructs where std::insert_iterator would perform hinted insertion.
This diff adds a new class, folly::hint_emplace_iterator(), and corresponding convenience function, folly::hint_emplacer(), which calls Container::emplace_hint() rather than Container::emplace().
It would have been trivial to copy&paste the existing folly::emplace_iterator class and simply replace the emplace() call with emplace_hint(), but I did not like the large amount of code repetition. So I decided to do some refactoring and move the emplace()/emplace_hint()/emplace_front()/emplace_back() calls into separate trait classes, and replace emplace_iterator()/hint_emplace_iterator()/front_emplace_iterator()/back_emplace_iterator() with suitable type aliases.

Reviewed By: yfeldblum

Differential Revision: D5097860

fbshipit-source-id: c0b733131a0d0d21fc0a8b08ad655142c6a41c19
folly/Iterator.h
folly/test/IteratorTest.cpp