Commit 641b9df1 authored by Steve O'Brien's avatar Steve O'Brien Committed by Facebook Github Bot

folly/ThreadLocal: remove dependency on iterator_facade

Summary: In a test build `<iterator/iterator_facade>` showed up as the most heavyweight include.  Remove this include, dependency on the boost lib, and implement whatever's needed for the bidirectional iterator interface.

Reviewed By: yfeldblum

Differential Revision: D7781659

fbshipit-source-id: 380e0ae85b18c245845f479b2d268fdd3e16d54a
parent f3bc89fd
...@@ -40,14 +40,15 @@ ...@@ -40,14 +40,15 @@
#pragma once #pragma once
#include <boost/iterator/iterator_facade.hpp> #include <iterator>
#include <type_traits>
#include <utility>
#include <folly/Likely.h> #include <folly/Likely.h>
#include <folly/Portability.h> #include <folly/Portability.h>
#include <folly/ScopeGuard.h> #include <folly/ScopeGuard.h>
#include <folly/SharedMutex.h> #include <folly/SharedMutex.h>
#include <folly/detail/ThreadLocalDetail.h> #include <folly/detail/ThreadLocalDetail.h>
#include <type_traits>
#include <utility>
namespace folly { namespace folly {
...@@ -259,12 +260,8 @@ class ThreadLocalPtr { ...@@ -259,12 +260,8 @@ class ThreadLocalPtr {
friend class Iterator; friend class Iterator;
// The iterators obtained from Accessor are bidirectional iterators. // The iterators obtained from Accessor are bidirectional iterators.
class Iterator : public boost::iterator_facade< class Iterator {
Iterator, // Derived
T, // value_type
boost::bidirectional_traversal_tag> { // traversal
friend class Accessor; friend class Accessor;
friend class boost::iterator_core_access;
const Accessor* accessor_; const Accessor* accessor_;
threadlocal_detail::ThreadEntry* e_; threadlocal_detail::ThreadEntry* e_;
...@@ -277,8 +274,12 @@ class ThreadLocalPtr { ...@@ -277,8 +274,12 @@ class ThreadLocalPtr {
e_ = e_->prev; e_ = e_->prev;
decrementToValid(); decrementToValid();
} }
const T& dereference() const {
return *static_cast<T*>(e_->elements[accessor_->id_].ptr);
}
T& dereference() const { T& dereference() {
return *static_cast<T*>(e_->elements[accessor_->id_].ptr); return *static_cast<T*>(e_->elements[accessor_->id_].ptr);
} }
...@@ -305,6 +306,59 @@ class ThreadLocalPtr { ...@@ -305,6 +306,59 @@ class ThreadLocalPtr {
void decrementToValid() { void decrementToValid() {
for (; e_ != &accessor_->meta_.head_ && !valid(); e_ = e_->prev) { } for (; e_ != &accessor_->meta_.head_ && !valid(); e_ = e_->prev) { }
} }
public:
using difference_type = ssize_t;
using value_type = T;
using reference = T const&;
using pointer = T const*;
using iterator_category = std::bidirectional_iterator_tag;
Iterator& operator++() {
increment();
return *this;
}
Iterator& operator++(int) {
Iterator copy(*this);
increment();
return copy;
}
Iterator& operator--() {
decrement();
return *this;
}
Iterator& operator--(int) {
Iterator copy(*this);
decrement();
return copy;
}
T& operator*() {
return dereference();
}
T const& operator*() const {
return dereference();
}
T* operator->() {
return &dereference();
}
T const* operator->() const {
return &dereference();
}
bool operator==(Iterator const& rhs) const {
return equal(rhs);
}
bool operator!=(Iterator const& rhs) const {
return !equal(rhs);
}
}; };
~Accessor() { ~Accessor() {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment