84 lines
2.3 KiB
C++
84 lines
2.3 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// (C) Copyright Ion Gaztanaga 2006-2013
|
|
//
|
|
// Distributed under the Boost Software License, Version 1.0.
|
|
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
// http://www.boost.org/LICENSE_1_0.txt)
|
|
//
|
|
// See http://www.boost.org/libs/intrusive for documentation.
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//[doc_window_code
|
|
#include <boost/intrusive/list.hpp>
|
|
|
|
using namespace boost::intrusive;
|
|
|
|
//An abstract class that can be inserted in an intrusive list
|
|
class Window : public list_base_hook<>
|
|
{
|
|
public:
|
|
//This is a container those value is an abstract class: you can't do this with std::list.
|
|
typedef list<Window> win_list;
|
|
|
|
//A static intrusive list declaration
|
|
static win_list all_windows;
|
|
|
|
//Constructor. Includes this window in the list
|
|
Window() { all_windows.push_back(*this); }
|
|
//Destructor. Removes this node from the list
|
|
virtual ~Window() { all_windows.erase(win_list::s_iterator_to(*this)); }
|
|
//Pure virtual function to be implemented by derived classes
|
|
virtual void Paint() = 0;
|
|
};
|
|
|
|
//The static intrusive list declaration
|
|
Window::win_list Window::all_windows;
|
|
|
|
//Some Window derived classes
|
|
class FrameWindow : public Window
|
|
{ virtual void Paint() BOOST_OVERRIDE {/**/} };
|
|
|
|
class EditWindow : public Window
|
|
{ virtual void Paint() BOOST_OVERRIDE {/**/} };
|
|
|
|
class CanvasWindow : public Window
|
|
{ virtual void Paint() BOOST_OVERRIDE {/**/} };
|
|
|
|
//A function that prints all windows stored in the intrusive list
|
|
void paint_all_windows()
|
|
{
|
|
for(Window::win_list::iterator i(Window::all_windows.begin())
|
|
, e(Window::all_windows.end())
|
|
; i != e; ++i)
|
|
i->Paint();
|
|
}
|
|
|
|
//...
|
|
|
|
//A class derived from Window
|
|
class MainWindow : public Window
|
|
{
|
|
FrameWindow frame_; //these are derived from Window too
|
|
EditWindow edit_;
|
|
CanvasWindow canvas_;
|
|
|
|
public:
|
|
void Paint() BOOST_OVERRIDE {/**/}
|
|
//...
|
|
};
|
|
|
|
//Main function
|
|
int main()
|
|
{
|
|
//When a Window class is created, is automatically registered in the global list
|
|
MainWindow window;
|
|
|
|
//Paint all the windows, sub-windows and so on
|
|
paint_all_windows();
|
|
|
|
//All the windows are automatically unregistered in their destructors.
|
|
return 0;
|
|
}
|
|
//]
|