From 4d552bef5814e5f9ba87123716d296a45b5d941e Mon Sep 17 00:00:00 2001 From: Andrzej Rybczak Date: Fri, 8 May 2015 21:42:09 +0200 Subject: [PATCH] menu: reduce indirection --- src/menu.h | 45 ++++++++++----------------------------------- src/menu_impl.h | 10 +++++----- 2 files changed, 15 insertions(+), 40 deletions(-) diff --git a/src/menu.h b/src/menu.h index 5f02b867..552e7fc7 100644 --- a/src/menu.h +++ b/src/menu.h @@ -37,8 +37,6 @@ namespace NC { /// holding any std::vector compatible values. template class Menu : public Window { - struct ItemProxy; - public: struct Item { @@ -82,16 +80,8 @@ public: bool m_is_separator; }; - typedef boost::indirect_iterator< - typename std::vector::iterator, - Item, - boost::random_access_traversal_tag - > Iterator; - typedef boost::indirect_iterator< - typename std::vector::const_iterator, - const Item, - boost::random_access_traversal_tag - > ConstIterator; + typedef typename std::vector::iterator Iterator; + typedef typename std::vector::const_iterator ConstIterator; typedef std::reverse_iterator ReverseIterator; typedef std::reverse_iterator ConstReverseIterator; @@ -226,20 +216,20 @@ public: /// @param pos requested position /// @return reference to item at given position /// @throw std::out_of_range if given position is out of range - Menu::Item &at(size_t pos) { return *m_items.at(pos); } + Menu::Item &at(size_t pos) { return m_items.at(pos); } /// @param pos requested position /// @return const reference to item at given position /// @throw std::out_of_range if given position is out of range - const Menu::Item &at(size_t pos) const { return *m_items.at(pos); } + const Menu::Item &at(size_t pos) const { return m_items.at(pos); } /// @param pos requested position /// @return const reference to item at given position - const Menu::Item &operator[](size_t pos) const { return *m_items[pos]; } + const Menu::Item &operator[](size_t pos) const { return m_items[pos]; } /// @param pos requested position /// @return const reference to item at given position - Menu::Item &operator[](size_t pos) { return *m_items[pos]; } + Menu::Item &operator[](size_t pos) { return m_items[pos]; } Iterator current() { return Iterator(m_items.begin() + m_highlight); } ConstIterator current() const { return ConstIterator(m_items.begin() + m_highlight); } @@ -272,31 +262,16 @@ public: ConstReverseValueIterator rendV() const { return ConstReverseValueIterator(beginV()); } private: - struct ItemProxy - { - typedef Item element_type; - - ItemProxy() { } - ItemProxy(Item item) : m_ptr(std::make_shared(std::move(item))) { } - - Item &operator*() const { return *m_ptr; } - Item *operator->() const { return m_ptr.get(); } - - bool operator==(const ItemProxy &rhs) const { return m_ptr == rhs.m_ptr; } - - private: - std::shared_ptr m_ptr; - }; - + bool isHighlightable(size_t pos) { - return !m_items[pos]->isSeparator() - && !m_items[pos]->isInactive(); + return !m_items[pos].isSeparator() + && !m_items[pos].isInactive(); } ItemDisplayer m_item_displayer; - std::vector m_items; + std::vector m_items; size_t m_beginning; size_t m_highlight; diff --git a/src/menu_impl.h b/src/menu_impl.h index 5fabfe5d..9f4cba01 100644 --- a/src/menu_impl.h +++ b/src/menu_impl.h @@ -191,12 +191,12 @@ void Menu::refresh() mvwhline(m_window, line, 0, KEY_SPACE, m_width); break; } - if (m_items[i]->isSeparator()) + if (m_items[i].isSeparator()) { mvwhline(m_window, line, 0, 0, m_width); continue; } - if (m_items[i]->isBold()) + if (m_items[i].isBold()) *this << Format::Bold; if (m_highlight_enabled && i == m_highlight) { @@ -204,18 +204,18 @@ void Menu::refresh() *this << m_highlight_color; } mvwhline(m_window, line, 0, KEY_SPACE, m_width); - if (m_items[i]->isSelected()) + if (m_items[i].isSelected()) *this << m_selected_prefix; if (m_item_displayer) m_item_displayer(*this); - if (m_items[i]->isSelected()) + if (m_items[i].isSelected()) *this << m_selected_suffix; if (m_highlight_enabled && i == m_highlight) { *this << Color::End; *this << Format::NoReverse; } - if (m_items[i]->isBold()) + if (m_items[i].isBold()) *this << Format::NoBold; } Window::refresh();