ArbitrarilyAccessedDataStorageInputOwn::operator=: различия между версиями

Материал из CAMaaS preliminary wiki
Перейти к навигации Перейти к поиску
 
(не показана 1 промежуточная версия этого же участника)
Строка 1: Строка 1:
{{function_begin|ArbitrarilyAccessedDataStorageInputOwn() noexcept; //1
{{function_begin|ArbitrarilyAccessedDataStorageInputOwn& operator{{=}}(ArbitrarilyAccessedDataStorageInputOwn&& right); //1
explicit ArbitrarilyAccessedDataStorageInputOwn(const IArbitrarilyAccessedDataStorageInput* pArbitrarilyAccessedDataStorage) noexcept; //2
template <class RightAdapterType>
ArbitrarilyAccessedDataStorageInputOwn(ArbitrarilyAccessedDataStorageInputOwn&& right) noexcept; //3
ArbitrarilyAccessedDataStorageInputOwn& operator{{=}}(RightAdapterType&& right); //2
template <class AnotherAdapterRef>
|{{ArbitrarilyAccessedDataStorageInputOwn::operator{{=}} brief}}
explicit ArbitrarilyAccessedDataStorageInputOwn(const AnotherAdapterRef& refRight) noexcept; //4
# Оператор присваивания с перемещением, который переносит владение реализацией накопителя данных адаптеру {{cpp_this}}. Присваивание адаптеру разрешено, только если он не был до этого проинициализирован действительным адресом реализации накопителя или был сброшен с помощью [[ArbitrarilyAccessedDataStorageInputOwn::release_ownership]] или [[ArbitrarilyAccessedDataStorageInputOwn::reset_ownership]] без параметров. В противном случае генерируются исключения - [https://www.chusov.org/doxygen/struct_chusov_1_1_exceptions_1_1_unsupported_call_exception.html Chusov::Exceptions::UnsupportedCallException], если {{param|right}} не содержит реализации [[IArbitrarilyAccessedDataStorageInput]], и [https://www.chusov.org/doxygen/struct_chusov_1_1_exceptions_1_1_invalid_parameter_exception.html Chusov::Exceptions::InvalidParameterException] - в противном случае.
template <class AnotherAdapterOwn>
# Аналогично, но с приведением типа указателя на реализацию с <source lang="cpp" inline>typename std::remove_reference_t<RightAdapterType>::interface_type*</source> к типу <source lang="cpp" inline>const IArbitrarilyAccessedDataStorageInput*</source>. Данная перегрузка участвует в процедуре разрешения перегрузок, только если <source lang="cpp" inline>RightAdapterType&&</source> является rvalue-ссылкой, тип <source lang="cpp" inline>std::decay_t<RightAdapterType></source> является [[владеющий адаптер|адаптером с владением]] с подтипом <tt>interface_type</tt>, указатель на который неявно приводим к <source lang="cpp" inline>const IArbitrarilyAccessedDataStorageInput*</source>.}}
ArbitrarilyAccessedDataStorageInputOwn(const AnotherAdapterOwn& ownRight) noexcept; //5
template <class AnotherAdapterOwn>
ArbitrarilyAccessedDataStorageInputOwn(AnotherAdapterOwn&& ownRight) noexcept; //6
|{{ArbitrarilyAccessedDataStorageInputOwn::ArbitrarilyAccessedDataStorageInputOwn brief}}
# Конструктор по умолчанию, инициализирующий создаваемый экземпляр адаптера нулевым адресом.
# Явный конструктор, инициализирующий создаваемый экземпляр адаптера адресом реализации накопителя данных.
# Конструктор, выполняющий инициализацию адаптера с перемещением адреса реализации, с которой ассоциирован параметр. Адаптер {{param|right}} в результате операции теряет владение реализацией накопителя данных, как если бы был выполнен вызов <source lang="cpp" inline>right.release_ownership()</source> с присваиванием возвращенного адреса создаваемому адаптеру.
# Явный конструктор, создающий адаптер с адресом реализации интерфейса, полученным из [[ссылочный адаптер|ссылочного адаптера]] {{param|refRight}} путем вызова <source lang="cpp" inline>refRight.get_interface()->Clone()</source> с неявным приведением результата к типу <source lang="cpp" inline>const IArbitrarilyAccessedDataStorageInput*</source>. Данный конструктор участвует в разрешении перегрузки, только если подтип <source lang="cpp" inline>AnotherAdapterRef::interface_type</source> существует и поддерживает метод <source lang="cpp" inline>AnotherAdapterRef::interface_type::Clone()</source>, указатель <source lang="cpp" inline>AnotherAdapterRef::interface_type*</source> приводим неявно к типу <source lang="cpp" inline>const IArbitrarilyAccessedDataStorageInput*</source>, а сам тип {{param|AnotherAdapterRef}} является [[ссылочный адаптер|ссылочным адаптером]].
# Конструктор, создающий экземпляр адаптера на основе заданного параметрически владеющего адаптера путем клонирования интерфейса (то есть вызова метода <source lang="cpp" inline>ownRight.get_interface()->Clone()</source>). Данный конструктор участвует в разрешении перегрузки, только если подтип <source lang="cpp" inline>AnotherAdapterOwn::interface_type</source> существует и поддерживает метод <source lang="cpp" inline>AnotherAdapterOwn::interface_type::Clone()</source>, указатель <source lang="cpp" inline>AnotherAdapterOwn::interface_type*</source> приводим неявно к типу <source lang="cpp" inline>const IArbitrarilyAccessedDataStorageInput*</source>, а сам тип {{param|AnotherAdapterOwn}} является [[владеющий адаптер|адаптером с владением]].
# Конструктор, создающий экземпляр адаптера путем переноса адреса реализации интерфейса <source lang="cpp" inline>AnotherAdapterOwn::interface_type</source> с приведением его к типу <source lang="cpp" inline>const IArbitrarilyAccessedDataStorageInput*</source>. В результате вызова адаптер {{param|ownRight}} теряет владение своим экземпляром реализации интерфейса <source lang="cpp" inline>AnotherAdapterOwn::interface_type</source> и инициализируется нулевым адресом, как если бы был выполнен вызов <source lang="cpp" inline>ownRight.release_ownership()</source>.}}
{{function template paramlist begin}}
{{function template paramlist begin}}
{{function template paramlist add|AnotherAdapterRef|Тип ссылочного адаптера, участвующего в качестве параметра {{param|refRight}} в конструкторе 4. Значение <source lang="cpp" inline>std::is_convertible_v<typename AnotherAdapterRef::interface_type*, const IArbitrarilyAccessedDataStorageInput*></source> должно быть {{cpp_true}}, адаптер - [[ссылочный адаптер|ссылочным]], а интерфейс <source lang="cpp" inline>AnotherAdapterRef::interface_type</source> должен поддерживать вызов <source lang="cpp" inline>pI->Clone(&pCopy)</source>, где <tt>pI</tt> - указатель оригинальную реализацию интерфейса <source lang="cpp" inline>AnotherAdapterRef::interface_type</source>, <tt>pCopy</tt> - указатель, на выходе функции <tt>Clone</tt> принимающий адрес копии оригинальной реализации.}}
{{function template paramlist add|RightAdapterType|Тип адаптера с владением реализацией интерфейса [[IArbitrarilyAccessedDataStorageInput]] (или неявно приводимого к типу <source lang="cpp" inline>const IArbitrarilyAccessedDataStorageInput*</source> интерфейса), которая передается экземпляру {{cpp_this}} адаптера перегрузкой 2. Тип <source lang="cpp" inline>std::decay_t<RightAdapterType></source> должен задавать адаптер с владением через указатель, приводимый к типу <source lang="cpp" inline>const IArbitrarilyAccessedDataStorageInput*</source>.}}
{{function template paramlist add|AnotherAdapterOwn|Тип адаптера с владением, участвующего в качестве параметра {{param|ownRight}} в конструкторах 5 и 6. Значение <source lang="cpp" inline>std::is_convertible_v<typename AnotherAdapterOwn::interface_type*, const IArbitrarilyAccessedDataStorageInput*></source> должно быть {{cpp_true}}, адаптер - [[владеющий адаптер|владеющим]]. Для копирования перегрузкой 5 интерфейс <source lang="cpp" inline>AnotherAdapterOwn::interface_type</source> также должен поддерживать вызов <source lang="cpp" inline>pI->Clone(&pCopy)</source>, где <tt>pI</tt> - указатель оригинальную реализацию интерфейса <source lang="cpp" inline>AnotherAdapterRef::interface_type</source>, <tt>pCopy</tt> - указатель, на выходе функции <tt>Clone</tt> принимающий адрес копии оригинальной реализации.}}
{{function template paramlist end}}
{{function template paramlist end}}
{{function_paramlist begin}}
{{function_paramlist begin}}
{{function_paramlist add|pArbitrarilyAccessedDataStorage|Указатель на адаптируемую реализацию накопителя данных [[IArbitrarilyAccessedDataStorageInput]].|paramdir=[in]}}
{{function_paramlist add|right|Адаптер, передающий владение своим интерфейсным указателем, если он есть, создаваемому экземпляру [[ArbitrarilyAccessedDataStorageInputOwn]], как если бы был выполнен вызов <source lang="cpp" inline>right.release_ownership()</source>.}}
{{function_paramlist add|right|Адаптер, передающий владение своим интерфейсным указателем, если он есть, создаваемому экземпляру [[ArbitrarilyAccessedDataStorageInputOwn]], как если бы был выполнен вызов <source lang="cpp" inline>right.release_ownership()</source>.}}
{{function_paramlist add|refRight|[[Ссылочный адаптер]], реализация интерфейса которого клонируется с целью создания копии, управляемой создаваемым адаптером, как если бы было выполнено создание адаптера путем вызова перегрузки 2 с аргументом <tt>pCopy</tt>, получаемым в результате вызова <source lang="cpp" inline>refRight.get_interface()->Clone(&pCopy)</source>.}}
{{function_paramlist add|ownRight|[[Владеющий адаптер]], реализация интерфейса которого клонируется или переносится на создаваемый адаптер. Копирование выполняется перегрузкой 5, как если бы было выполнено создание адаптера путем вызова перегрузки 2 с аргументом <tt>pCopy</tt>, получаемым в результате вызова <source lang="cpp" inline>ownRight.get_interface()->Clone(&pCopy)</source>. Перемещение выполняется перегрузкой 6, как если бы было выполнено создание адаптера путем вызова перегрузки 2 с аргументом <source lang="cpp" inline>ownRight.release_ownership()</source>.}}
{{function_paramlist end}}
{{function_paramlist end}}
{{function_end}}
{{function_end}}

Текущая версия на 17:07, 15 августа 2019

ArbitrarilyAccessedDataStorageInputOwn& operator=(ArbitrarilyAccessedDataStorageInputOwn&& right); //1
template <class RightAdapterType>
ArbitrarilyAccessedDataStorageInputOwn& operator=(RightAdapterType&& right); //2

Операторы присваивания адаптера с владением.

  1. Оператор присваивания с перемещением, который переносит владение реализацией накопителя данных адаптеру this. Присваивание адаптеру разрешено, только если он не был до этого проинициализирован действительным адресом реализации накопителя или был сброшен с помощью ArbitrarilyAccessedDataStorageInputOwn::release_ownership или ArbitrarilyAccessedDataStorageInputOwn::reset_ownership без параметров. В противном случае генерируются исключения - Chusov::Exceptions::UnsupportedCallException, если right не содержит реализации IArbitrarilyAccessedDataStorageInput, и Chusov::Exceptions::InvalidParameterException - в противном случае.
  2. Аналогично, но с приведением типа указателя на реализацию с typename std::remove_reference_t<RightAdapterType>::interface_type* к типу const IArbitrarilyAccessedDataStorageInput*. Данная перегрузка участвует в процедуре разрешения перегрузок, только если RightAdapterType&& является rvalue-ссылкой, тип std::decay_t<RightAdapterType> является адаптером с владением с подтипом interface_type, указатель на который неявно приводим к const IArbitrarilyAccessedDataStorageInput*.
Параметры шаблона
RightAdapterTypeТип адаптера с владением реализацией интерфейса IArbitrarilyAccessedDataStorageInput (или неявно приводимого к типу const IArbitrarilyAccessedDataStorageInput* интерфейса), которая передается экземпляру this адаптера перегрузкой 2. Тип std::decay_t<RightAdapterType> должен задавать адаптер с владением через указатель, приводимый к типу const IArbitrarilyAccessedDataStorageInput*.
Параметры
rightАдаптер, передающий владение своим интерфейсным указателем, если он есть, создаваемому экземпляру ArbitrarilyAccessedDataStorageInputOwn, как если бы был выполнен вызов right.release_ownership().