Increased std::vector compatibility of fbvector
Summary: fbvector was not accepting move_iterators for InputIterator-templated construct, assign, and insert. The root cause was the check '(b_ <= &*first && &*first < e_)', used to check if the assignment was from internal data. This addressof check does not compile with rvalue-references, and causes the first iterator to be dereferenced more than once; both against the contract of std::vector. The standard allows for undefined behaviour in the self-iterator case, so there are no contractual barriers to removing this check. Test Plan: run fbvector test and benchmark. An fbgs for 'assign' turns up few matches; the seem to be normal use-case. Test fbvector assign with self-iterators in order (i.e. fbv.assign(fbv.begin(), fbv.end())); this seems to work fine. Reviewed By: andrei.alexandrescu@fb.com FB internal diff: D535012
Showing
Please register or sign in to comment