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
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой 1.5.3 |