mirror of
https://github.com/boostorg/intrusive.git
synced 2026-05-03 19:30:46 +02:00
First inclusion
[SVN r37593]
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// (C) Copyright Ion Gaztañaga 2006-2007
|
||||
//
|
||||
// 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< list_base_hook<>::value_traits<Window> > win_list;
|
||||
|
||||
//An 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::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
|
||||
{ void Paint(){/**/} };
|
||||
|
||||
class EditWindow : public Window
|
||||
{ void Paint(){/**/} };
|
||||
|
||||
class CanvasWindow : public Window
|
||||
{ void Paint(){/**/} };
|
||||
|
||||
//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(){/**/}
|
||||
//...
|
||||
};
|
||||
|
||||
//Main function
|
||||
int main()
|
||||
{
|
||||
//When each 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;
|
||||
}
|
||||
//]
|
||||
Reference in New Issue
Block a user