BDE 4.14.0 Production release
Loading...
Searching...
No Matches
bslstl_function_rep

Functions

 bslstl::Function_Rep::ManagerRet::ManagerRet (std::size_t s)
 Create a union holding the specified s size_t.
 
 bslstl::Function_Rep::ManagerRet::ManagerRet (void *p)
 Create a union holding the specified p pointer.
 
 bslstl::Function_Rep::ManagerRet::operator std::size_t () const
 
template<class TP >
 bslstl::Function_Rep::ManagerRet::operator TP * () const
 
template<class FUNC , bool INPLACE>
bslstl::Function_Rep::ManagerRet bslstl::Function_Rep::functionManager (ManagerOpCode opCode, Function_Rep *rep, void *srcVoidPtr)
 
 bslstl::Function_Rep::Function_Rep (const allocator_type &allocator) BSLS_KEYWORD_NOEXCEPT
 
template<class FUNC >
void bslstl::Function_Rep::installFunc (BSLS_COMPILERFEATURES_FORWARD_REF(FUNC) func, GenericInvoker invoker)
 
template<class TP >
TP * bslstl::Function_Rep::target () const BSLS_KEYWORD_NOEXCEPT
 
template<class TP , bool INPLACE>
TP * bslstl::Function_Rep::targetRaw () const BSLS_KEYWORD_NOEXCEPT
 
allocator_type bslstl::Function_Rep::get_allocator () const BSLS_KEYWORD_NOEXCEPT
 Return the allocator used to supply memory for this object.
 
GenericInvokerbslstl::Function_Rep::invoker () const BSLS_KEYWORD_NOEXCEPT
 
bool bslstl::Function_Rep::isEmpty () const BSLS_KEYWORD_NOEXCEPT
 

Detailed Description

Outline

Purpose

Provide a non-template, common implementation for bsl::function.

Classes

See also
bslstl_function

Description

This private, subordinate component to bslstl_function provides a non-template class, Function_Rep, that is the data representation of bsl::function (see bslstl_function ). The bsl::function class template uses bslstl::Function_Rep to store the callable held by the function (its target), the allocator, and a pointer to the function it uses to indirectly invoke the target (the invoker function).

The client of this component, bsl::function, is a complex class that is templated in two ways:

  1. The class itself has a template parameter representing the prototype (argument and return types) of its call operator. E.g., type bsl::function<int(char*)> has member int operator()(char*);.
  2. Several of its constructors are templated on a callable type and wrap an object of that type. By using type erasure, the type of the wrapped target is not part of the type of the bsl::function.

The Function_Rep class takes care of the runtime polymorphism required by (2), above. It stores the target object (which can be of any size), copy- or move-constructs it, destroys it, and returns its runtime type, size, and address. Nothing in Function_Rep is concerned with the call prototype.

Function_Rep is a quasi-value-semantic type: It doesn't provide copy and move constructors or assignment operators, but it does have the abstract notion of an in-memory value (the target object, if not empty) and it provides methods for copying, moving, swapping, and destroying that value. There is no ability to provide equality comparison because the wrapped object is not required to provide equality comparison operations.

Function_Rep has only one constructor, which creates an empty object (one with no target) using a specified allocator. The methods of Function_Rep are a collection of primitive operations for setting, getting, copy constructing, move constructing, or swapping the target object, as well as accessing the allocator and invoker function pointer. The methods to set and get the invoker pointer represent it as a generic function pointer (the closest we could get to void * for function pointers), so it is up to the caller to cast the pointer back to a specific function pointer type before invoking it.

Function Documentation

◆ Function_Rep()

bslstl::Function_Rep::Function_Rep ( const allocator_type allocator)
inlineexplicit

Create an empty object using the specified allocator to supply memory.

◆ functionManager()

template<class FUNC , bool INPLACE>
bslstl::Function_Rep::ManagerRet bslstl::Function_Rep::functionManager ( ManagerOpCode  opCode,
Function_Rep rep,
void *  srcVoidPtr 
)

◆ get_allocator()

bslstl::Function_Rep::allocator_type bslstl::Function_Rep::get_allocator ( ) const
inline

◆ installFunc()

template<class FUNC >
void bslstl::Function_Rep::installFunc ( BSLS_COMPILERFEATURES_FORWARD_REF(FUNC)  func,
GenericInvoker  invoker 
)

Do nothing if the specified func is a null pointer, otherwise allocate storage (either in-place within this object's small-object buffer or out-of-place from the allocator) to hold a target of (template parameter) type FUNC, forward the func to the constructor of the new target, set d_funcManager_p to manage the new target, and set d_invoker_p to the specified invoker address. The behavior is undefined unless this object is empty on entry. Note that FUNC will not qualify for the small-object optimization unless bsl::is_nothrow_move_constructible<FUNC>::value is true.

◆ invoker()

bslstl::Function_Rep::GenericInvoker * bslstl::Function_Rep::invoker ( ) const
inline

Return a pointer the invoker function set using installFunc or a null pointer if this object is empty.

◆ isEmpty()

bool bslstl::Function_Rep::isEmpty ( ) const
inline

Return true if invoker() is a null pointer, indicating that this object has no target object.

◆ ManagerRet() [1/2]

bslstl::Function_Rep::ManagerRet::ManagerRet ( std::size_t  s)
inline

◆ ManagerRet() [2/2]

bslstl::Function_Rep::ManagerRet::ManagerRet ( void *  p)
inline

◆ operator std::size_t()

bslstl::Function_Rep::ManagerRet::operator std::size_t ( ) const
inline

Return the size_t stored in this union. The behavior is undefined unless this object was constructed with a size_t.

◆ operator TP *()

template<class TP >
bslstl::Function_Rep::ManagerRet::operator TP * ( ) const
inline

Return the pointer stored in this union. The behavior is undefined unless this object was constructed with a TP *.

◆ target()

template<class TP >
TP * bslstl::Function_Rep::target ( ) const
inline

If typeid(TP) == this->target_type(), return a pointer offering modifiable access to this object's target; otherwise return a null pointer. Note that this function is const but returns a non-const pointer because, according to the C++ Standard, function (and therefore this representation) does not adhere to logical constness conventions.

◆ targetRaw()

template<class TP , bool INPLACE>
TP * bslstl::Function_Rep::targetRaw ( ) const
inline

Return a pointer offering modifiable access to this object's target. If INPLACE is true, then the object is assumed to be allocated inplace in the small object buffer. Note that this function is const but returns a non-const pointer because this type does not adhere to logical constness conventions. The behavior is undefined unless typeid(TP) == this->target_type() and INPLACE correctly identifies whether the target is inplace.