From d03c4a88b662152f79d5d6d1f77ac5f7b330ac4c Mon Sep 17 00:00:00 2001 From: Andrzej Rybczak Date: Fri, 13 Mar 2009 13:26:29 +0100 Subject: [PATCH] fix Menu copy constructor it has to make deep copy of itsOptions. --- src/menu.h | 59 +++++++++++++++++++++++++++---------------------- src/strbuffer.h | 7 ++++++ 2 files changed, 40 insertions(+), 26 deletions(-) diff --git a/src/menu.h b/src/menu.h index 8baab087..fca81771 100644 --- a/src/menu.h +++ b/src/menu.h @@ -211,36 +211,43 @@ namespace NCurses } template NCurses::Menu::Menu(size_t startx, - size_t starty, - size_t width, - size_t height, - const std::string &title, - Color color, - Border border) - : Window(startx, starty, width, height, title, color, border), - itsItemDisplayer(0), - itsItemDisplayerUserdata(0), - itsGetStringFunction(0), - itsGetStringFunctionUserData(0), - itsOptionsPtr(&itsOptions), - itsBeginning(0), - itsHighlight(0), - itsHighlightColor(itsBaseColor), - highlightEnabled(1), - itsSelectedPrefix(0), - itsSelectedSuffix(0) + size_t starty, + size_t width, + size_t height, + const std::string &title, + Color color, + Border border) + : Window(startx, starty, width, height, title, color, border), + itsItemDisplayer(0), + itsItemDisplayerUserdata(0), + itsGetStringFunction(0), + itsGetStringFunctionUserData(0), + itsOptionsPtr(&itsOptions), + itsBeginning(0), + itsHighlight(0), + itsHighlightColor(itsBaseColor), + highlightEnabled(1), + itsSelectedPrefix(0), + itsSelectedSuffix(0) { } -template NCurses::Menu::Menu(const Menu &m) : Window(m) +template NCurses::Menu::Menu(const Menu &m) : Window(m), + itsItemDisplayer(m.itsItemDisplayer), + itsItemDisplayerUserdata(m.itsItemDisplayerUserdata), + itsGetStringFunction(m.itsGetStringFunction), + itsGetStringFunctionUserData(m.itsGetStringFunctionUserData), + itsOptionsPtr(m.itsOptionsPtr), + itsBeginning(m.itsBeginning), + itsHighlight(m.itsHighlight), + itsHighlightColor(m.itsHighlightColor), + highlightEnabled(m.highlightEnabled), + itsSelectedPrefix(m.itsSelectedPrefix), + itsSelectedSuffix(m.itsSelectedSuffix) { - itsOptions = m.itsOptions; - itsItemDisplayer = m.itsItemDisplayer; - itsItemDisplayerUserdata = m.itsItemDisplayerUserdata; - itsBeginning = m.itsBeginning; - itsHighlight = m.itsHighlight; - itsHighlightColor = m.itsHighlightColor; - highlightEnabled = m.highlightEnabled; + itsOptions.reserve(m.itsOptions.size()); + for (option_const_iterator it = m.itsOptions.begin(); it != m.itsOptions.end(); it++) + itsOptions.push_back(new Option(**it)); } template NCurses::Menu::~Menu() diff --git a/src/strbuffer.h b/src/strbuffer.h index 54c45a85..8aae0bda 100644 --- a/src/strbuffer.h +++ b/src/strbuffer.h @@ -47,6 +47,7 @@ namespace NCurses public: basic_buffer() : itsTempString(0) { } + basic_buffer(const basic_buffer &b); std::basic_string Str() const; void SetFormatting(short vb, const std::basic_string &s, short ve, bool for_each = 1); @@ -71,6 +72,12 @@ namespace NCurses typedef basic_buffer WBuffer; } +template NCurses::basic_buffer::basic_buffer(const basic_buffer &b) : itsFormat(b.itsFormat), + itsTempString(b.itsTempString) +{ + itsString << b.itsString.str(); +} + template std::basic_string NCurses::basic_buffer::Str() const { return itsString.str();