Using.h

См. документацию.
00001 /*
00002  * CntmLib - Подсчет ссылок, потоки, синхронизация, асинхронные процедуры, события
00003  * Copyright (c) 2005, Овсеевич Роман, CntmLib@mail.ru
00004  * _______________________________________________________________________________
00005  * Разрешено свободное использование, копирование, распространение, изменение
00006  * (изменение сведений об авторских правах запрещено). Запрещена продажа и
00007  * включение всей библиотеки или ее частей в другие библиотеки. В сведениях об
00008  * авторских правах на программу (или сведениях о программе, об авторах,
00009  * использованных средствах разработки и т.д.) должна быть указана информация
00010  * о библиотеке CntmLib, ее авторе и, возможно, сайте или email'е.
00011  * Библиотека поставляется "как есть", без каких-либо гарантий со стороны автора.
00012  */
00013 
00014 #ifndef CNTM_USING_H
00015 #define CNTM_USING_H
00016 #include <Cntm/Concurrency/ExecutionUnit.h>
00017 #include <Cntm/Concurrency/TerminatingSignal.h>
00018 #include <Cntm/RefCount/IRefObject.h>
00019 
00020 namespace Cntm
00021 {
00022 
00023         /**
00024          * Объекты данного класса используются как scoped-объекты, наподобии auto_ptr и т.п., и являются по сути ссылочными указателями на объекты. Using-объекты преследуют 2 цели: 1 - при создании они проверяют флаг завершения потока и переданный ссылочный указатель на NULL (т.е. объект уже находится в удаляемом состоянии), если какое либо из этих условий истинно, то генерируется специальное исключение Cntm::TerminatingSignal. 2 цель - хранить полученный ссылочный на время существования Using-объекта, т.о. гарантируется, что при выполнении кода, находящегося между созданием и деинициализацией Using-объекта объект не перейдет в удаляемое состояние.
00025          * 
00026          * Пример использования.
00027          * Using use(*this); // Вход в Using-секцию. Либо вход будет успешный, либо, если поток необходимо завершить, то будет сгенерировано исключение TerminatingSignal.
00028          * ... // В этом блоке объект всегда находится не в удаляемом состоянии и преобразование обычного указателя (например, this) к ссылочному никогда не приведет к результату NULL.
00029          * use.Unuse(); // Выход из блока.
00030          * 
00031          * Использование Using-объектов целесообразно там, где единица выполнения не хранит ссылку на объект, метод которого выполняет, т.е. использовать их следует в потоках активных объектов и асинхронных процедурах, если они не хранят ссылочный указатель на объект.
00032          * 
00033          * Класс не поддерживает многопоточность.
00034          * @author Овсеевич Р.
00035          * \ingroup Concurrency
00036          */
00037         class Using: public IRefObject::Ptr
00038         {
00039         public:
00040 
00041                 /**
00042                  * Конструктор инициализации ссылочным указателем или ссылкой (которая м.б. преобразована к ссылочному указателю) на объект. Сохраняет полученный ссылочный указатель.
00043                  * 
00044                  * Исключение: TerminatingSignal - если установлен флаг Terminated() текущей единицы выполнения или объект находится в удаляемом состоянии (ссылочный указатель на него равен NULL).
00045                  * @param Object - сылочный указатель или ссылка на объект, который будет использоваться в этой секции.
00046                  */
00047                 Using(const IRefObject::Ptr& Object): IRefObject::Ptr(Object)
00048                 {
00049                         ExecutionUnit::CheckTerminating();
00050                         if (!*this) throw TerminatingSignal();
00051                 }
00052 
00053                 /**
00054                  * Конструктор копирования. Сохраняет ссылочный указатель из источника.
00055                  * 
00056                  * Исключение: TerminatingSignal - если установлен флаг Terminated() текущей единицы выполнения или объект находится в удаляемом состоянии (ссылочный указатель на него равен NULL).
00057                  * @param Src - секция-источник.
00058                  */
00059                 Using(const Using& Src): IRefObject::Ptr(Src)
00060                 {
00061                         ExecutionUnit::CheckTerminating();
00062                         if (!*this) throw TerminatingSignal();
00063                 }
00064 
00065                 /**
00066                  * Оператор присвоения ссылочного указателя или обычной ссылки (которая м.б. преобразована к ссылочному указателю) на объект. Сохраняет полученный ссылочный указатель.
00067                  * 
00068                  * Исключение: TerminatingSignal - если установлен флаг Terminated() текущей единицы выполнения или объект находится в удаляемом состоянии (ссылочный указатель на него равен NULL).
00069                  * @param Object - сылочный указатель или ссылка на объект, который будет использоваться в этой секции.
00070                  */
00071                 Using& operator = (const IRefObject::Ptr& Object)
00072                 {
00073                         ExecutionUnit::CheckTerminating();
00074                         IRefObject::Ptr::operator = (Object);
00075                         if (!*this) throw TerminatingSignal();
00076                         return *this;
00077                 }
00078 
00079                 /**
00080                  * Оператор присвоения. Сохраняет ссылочный указатель из источника.
00081                  * 
00082                  * Исключение: TerminatingSignal - если установлен флаг Terminated() текущей единицы выполнения или объект находится в удаляемом состоянии (ссылочный указатель на него равен NULL).
00083                  * @param Src - секция-источник.
00084                  */
00085                 Using& operator = (const Using& Src)
00086                 {
00087                         ExecutionUnit::CheckTerminating();
00088                         IRefObject::Ptr::operator = (Src);
00089                         if (!*this) throw TerminatingSignal();
00090                         return *this;
00091                 }
00092 
00093                 /**
00094                  * Досрочный выход из Using-секции. Сбрасывает в NULL значение хранящегося ссылочного указателя.
00095                  */
00096                 void Unuse() { SetNull(); }
00097         };
00098 
00099 }
00100 
00101 #endif //CNTM_USING_H

SourceForge.net Logo
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой  doxygen 1.5.3