Commit: d08fbfacb211848729a8db18a8520dddee15a4e6 Author: Hugo Sales Date: Wed Jun 19 17:19:36 2019 +0100 Branches: soc-2019-fast-io https://developer.blender.org/rBd08fbfacb211848729a8db18a8520dddee15a4e6
[Fast import/export] Removed the boost::iterator_facade dependency for iterators =================================================================== M source/blender/editors/io/intern/common.cpp M source/blender/editors/io/intern/iterators.hpp M source/blender/editors/io/intern/obj.cpp M source/blender/editors/io/intern/stl.cpp =================================================================== diff --git a/source/blender/editors/io/intern/common.cpp b/source/blender/editors/io/intern/common.cpp index 3f29341071a..a5085a303f2 100644 --- a/source/blender/editors/io/intern/common.cpp +++ b/source/blender/editors/io/intern/common.cpp @@ -231,6 +231,7 @@ bool export_end(bContext *UNUSED(C), ExportSettings *const settings) return true; } +/* clang-format off */ bool time_export(bContext *C, ExportSettings *const settings, void (*start)(bContext *C, ExportSettings *const settings), @@ -239,9 +240,12 @@ bool time_export(bContext *C, auto f = std::chrono::steady_clock::now(); start(C, settings); auto ret = end(C, settings); - std::cout << "Took " << (std::chrono::steady_clock::now() - f).count() << "ns\n"; + std::cout << "Took " + << std::chrono::duration_cast<std::chrono::milliseconds> + (std::chrono::steady_clock::now() - f).count() << "ms\n"; return ret; } +/* clang-format on */ const std::array<float, 3> calculate_normal(const Mesh *const mesh, const MPoly &mp) { diff --git a/source/blender/editors/io/intern/iterators.hpp b/source/blender/editors/io/intern/iterators.hpp index 4d41bc7bf8d..cbd825d37f4 100644 --- a/source/blender/editors/io/intern/iterators.hpp +++ b/source/blender/editors/io/intern/iterators.hpp @@ -29,408 +29,179 @@ extern "C" { namespace common { -// /* clang-format off */ -// template<typename T> -// struct pointer_iterator { -// using difference_type = ptrdiff_t; -// using value_type = T; -// using pointer = T *; -// using reference = T &; -// using iterator_category = std::random_access_iterator_tag; -// pointer_iterator() : first(nullptr), curr(nullptr), size(0) {} -// pointer_iterator(T *p) : curr(p), first(p), size(0) {} -// pointer_iterator(T *p, size_t size) : it(p), first(p), size(size) {} -// operator T *() const { return curr; } -// pointer_iterator &operator=(const pointer_iterator<T, iterator_category> &p) -// { -// // Placement new: construct a new object in the position of `this` -// // Doesn't actually allocate memory -// new (this) pointer_iterator(p); -// return *this; -// } -// pointer_iterator begin() const { return {first, size}; } -// pointer_iterator end() const { return {first + size, size}; } -// pointer_iterator &operator++() { ++curr; } -// pointer_iterator &operator--() { --curr; } -// pointer_iterator &operator+(ptrdiff_t n) { curr += n; return *this; } -// ptrdiff_t operator-(const pointer_iterator &other) const { return other.curr - curr; } -// bool operator==(const pointer_iterator &other) const { return curr == other.curr; } -// const T & operator*() const { return *curr; } -// T *first; -// T *curr; -// size_t size; -// }; -// /* clang-format on */ - +/* clang-format off */ // Adapt a pointer-size pair as a random access iterator // This makes use of `boost::iterator_facade` and makes it possible to use // for each style loops, as well as cleanly hiding how the underlying Blender // data structures are accessed -template<typename SourceT, typename Tag = std::random_access_iterator_tag> -struct pointer_iterator - : public boost::iterator_facade<pointer_iterator<SourceT, Tag>, SourceT &, Tag> { - pointer_iterator() : first(nullptr) - { - } - pointer_iterator(const pointer_iterator<SourceT, Tag> &) = default; - pointer_iterator(pointer_iterator<SourceT, Tag> &&) = default; - explicit pointer_iterator(SourceT *p) : it(p), first(p), size(0) - { - } - explicit pointer_iterator(SourceT *p, size_t size) : it(p), first(p), size(size) - { - } - operator SourceT *() const - { - return it; - } - pointer_iterator &operator=(const pointer_iterator<SourceT, Tag> &p) - { +template<typename T, typename Tag = std::random_access_iterator_tag> +struct pointer_iterator_base { + using difference_type = ptrdiff_t; + using value_type = T; + using pointer = T *; + using reference = T &; + using iterator_category = Tag; + pointer_iterator_base(pointer p, size_t size) : first(p), curr(p), size(size) {} + pointer_iterator_base(const pointer_iterator_base &pib) : first(pib.first), curr(pib.curr), size(pib.size) {} + operator pointer() const { return curr; } + pointer_iterator_base &operator=(const pointer_iterator_base &p) { // Placement new: construct a new object in the position of `this` // Doesn't actually allocate memory - new (this) pointer_iterator(p); + new (this) pointer_iterator_base(p); return *this; } - // pointer_iterator & operator=(pointer_iterator<SourceT, Tag> &&p) = default;// { - // return pointer_iterator<SourceT, Tag>(p); - // } - pointer_iterator begin() const - { - return pointer_iterator{first, size}; - } - const pointer_iterator cbegin() const - { - return pointer_iterator{first, size}; - } - pointer_iterator end() const - { - return pointer_iterator{first + size, size}; - } - const pointer_iterator cend() const - { - return pointer_iterator{first + size, size}; - } - friend class boost::iterator_core_access; - void increment() - { - ++it; - } - void decrement() - { - --it; - } - void advance(ptrdiff_t n) - { - it += n; - } - ptrdiff_t distance_to(const pointer_iterator &other) - { - return other.it - it; - } - bool equal(const pointer_iterator &other) const - { - return it == other.it; - } - SourceT &dereference() const - { - return *this->it; - } - SourceT *it; - SourceT *const first; + pointer_iterator_base begin() const { return {this->first, this->size}; } + pointer_iterator_base end() const { return {this->first + this->size, this->size}; } + pointer_iterator_base & operator++() { ++curr; return *this; } + pointer_iterator_base & operator--() { --curr; return *this; } + pointer_iterator_base & operator+(difference_type n) { curr += n; return *this; } + ptrdiff_t operator-(const pointer_iterator_base &other) const { return other.curr - curr; } + bool operator==(const pointer_iterator_base &other) const { return curr == other.curr; } + pointer first; + pointer curr; size_t size; }; -// This is another iterator, whcih makes use of `boost::iterator_adaptor` to change how the -// underlying iterator behaves. Specifically, it uses the derived class' `dereference` method. This -// makes use of CRTP, the curiously recurring template pattern This means that the base class has, -// as a template paramater, the type of the derived class which means that it can hold a pointer to -// said derived class and call it's `dereference` method. -template<typename SourceT, - typename ResT, - typename CRTP, - typename Base = pointer_iterator<SourceT>, - typename Tag = typename std::iterator_traits<Base>::iterator_category> -struct dereference_iterator - : public boost::iterator_adaptor<dereference_iterator<SourceT, ResT, CRTP, Base>, - Base, - ResT, - Tag, - ResT> { - using dereference_iterator_ = dereference_iterator<SourceT, ResT, CRTP, Base>; - dereference_iterator() : dereference_iterator::iterator_adaptor_(), crtp(nullptr) - { - } - dereference_iterator(const dereference_iterator &di, CRTP *crtp) - : dereference_iterator::iterator_adaptor_(di.base()), crtp(crtp) - { - } - dereference_iterator(dereference_iterator &&di, CRTP *crtp) - : dereference_iterator::iterator_adaptor_(di.base()), crtp(crtp) - { - } - dereference_iterator(Base const &other, CRTP *crtp) - : dereference_iterator::iterator_adaptor_(other), crtp(crtp) - { - } - template<typename Size = size_t> - explicit dereference_iterator(SourceT *p, Size size, CRTP *crtp) - : dereference_iterator(Base{p, (size_t)size}, crtp) - { - } - explicit dereference_iterator(SourceT *p, CRTP *crtp) // For list_iterator - : dereference_iterator(Base{p}, crtp) - { - } - dereference_iterator begin() const - { - return {this->base().begin(), crtp}; - } - const dereference_iterator cbegin() const - { - return {this->base().cbegin(), crtp}; - } - dereference_iterator end() const - { - return {this->base().end(), crtp}; - } - const dereference_iterator cend() const - { - return {this->base().cend(), crtp}; - } - friend class boost::iterator_core_access; - ResT dereference() const - { - return crtp->dereference(this->base()); - } - CRTP *crtp; +template<typename T> +struct pointer_iterator : pointer_iterator_base<T, std::random_access_iterator_tag> { + using pointer_iterator_base<T, std::random_access_iterator_tag> + ::pointer_iterator_base; + inline const T & operator*() const { return *this->curr; } }; -// Another iterator that iterates over doubly linked lists +// An iterator that iterates over doubly linked lists template<typename SourceT, typename ResT = SourceT &, typename Tag = std::bidirectional_iterator_tag> -struct list_iterator : public boost::iterator_adaptor<list_iterator<SourceT, ResT, Tag>, - pointer_iterator<SourceT, Tag>, - ResT, - Tag, - ResT> { - list_iterator() : list_iterator::iterator_adaptor_(), first(nullptr) - { - } - list_iterator(const pointer_iterator<SourceT, Tag> &other) - : list_iterator::iterator_adaptor_(other), first(other.first) - { - } - explicit list_iterator(SourceT *first) - : list_iterator::iterator_adaptor_(pointer_iterator<SourceT, Tag>{first}), first(first) - { - } - list_iterator begin() const - { - return list_iterator{first}; - } - list_iterator end() const - { - return list_iterator{nullptr}; - } - const list_iterator cbegin() const - { - return list_iterator{first}; - } - const list_iterator cend() const - { - return list_iterator{nullptr}; - } - friend class boost::iterator_core_access; - void increment() - { - this->base_reference().it = this->base_reference()->next; - } @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs