diff options
Diffstat (limited to 'TAO/tao/Sequence.h')
-rw-r--r-- | TAO/tao/Sequence.h | 681 |
1 files changed, 0 insertions, 681 deletions
diff --git a/TAO/tao/Sequence.h b/TAO/tao/Sequence.h deleted file mode 100644 index 641a2c86f9d..00000000000 --- a/TAO/tao/Sequence.h +++ /dev/null @@ -1,681 +0,0 @@ -// -*- C++ -*- - -//============================================================================= -/** - * @file Sequence.h - * - * $Id$ - * - * @author Carlos O'Ryan - * @author Aniruddha Gokhale - */ -//============================================================================= - -#ifndef TAO_SEQUENCE_H -#define TAO_SEQUENCE_H - -#include /**/ "ace/pre.h" -#include "ace/CORBA_macros.h" - -#if !defined (ACE_LACKS_PRAGMA_ONCE) -# pragma once -#endif /* ACE_LACKS_PRAGMA_ONCE */ - -#include "tao/Managed_Types.h" -#include "tao/orbconf.h" -#include "tao/default_environment.h" - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL -class ACE_Message_Block; -ACE_END_VERSIONED_NAMESPACE_DECL - -TAO_BEGIN_VERSIONED_NAMESPACE_DECL - -namespace CORBA -{ - class Object; -} - -/** - * @class TAO_Base_Sequence - * - * @brief Base class for TAO sequences. - * - * This class provides a common interface for all IDL sequences, - * hence the interpreted marshal engine can manipulate them in a - * type safe manner. - */ -class TAO_Export TAO_Base_Sequence -{ -public: - /// We give access to TAO_Marshal_Sequence, this allows a safe yet - /// small footprint implementation of the marshal engine. - friend class TAO_Marshal_Sequence; - - /// Destructor. - virtual ~TAO_Base_Sequence (void); - - /// Return the maximum length of the sequence - CORBA::ULong maximum (void) const; - - /** - * Ensure that the buffer contains space for at least <length> - * elements. The constructor must be called for any new elements, - * the old ones (if any) must be copied into the buffer using - * operator= and then their destructors must be called. Finally the - * old buffer must be released. - */ - virtual void _allocate_buffer (CORBA::ULong length) = 0; - - /// Must deallocate the buffer and then set it to zero. - virtual void _deallocate_buffer (void) = 0; - - /** - * Some sequences (of objects and strings) require some cleanup if - * the sequence is shrunk. The spec requires the destructor to - * release the objects only from position <0> to <length-1>; so - * shrink and then delete could result in a memory leak. - */ - virtual void _shrink_buffer (CORBA::ULong new_length, - CORBA::ULong old_length); - - /// Used for sequences of objects to downcast a recently demarshalled - /// object reference into the right type. - virtual void _downcast (void *target, - CORBA::Object *src - ACE_ENV_ARG_DECL_WITH_DEFAULTS); - - /// Used for sequences of object to convert from the derived type - /// into the Object class. - virtual CORBA::Object *_upcast (void *src) const; - - // = orbos/98-01-11 proposed extensions. - /// Returns the state of the sequence release flag. - CORBA::Boolean release (void) const; - -protected: - /// Default constructor. - TAO_Base_Sequence (void); - - /// Constructor with control of ownership. - TAO_Base_Sequence (CORBA::ULong maximum, - CORBA::ULong length, - void *buffer, - CORBA::Boolean release = 0); - - /// Assume ownership and set length to 0. - TAO_Base_Sequence (CORBA::ULong maximum, - void *buffer); - - void check_bounds( - char const * filename, unsigned long lineno, - CORBA::ULong tao_idx, CORBA::ULong tao_max) const; - -public: - - // = The following two functions should be protected but we made it - // public because it breaks some compilers. - - // Copy constructor and assignment operator are protected, the - // derived classes must provided the right semantics for the buffer - // copy, only the static fields are actually copy. - TAO_Base_Sequence (const TAO_Base_Sequence &rhs); - TAO_Base_Sequence &operator= (const TAO_Base_Sequence &rhs); - -protected: - - /// The maximum number of elements the buffer can contain. - CORBA::ULong maximum_; - - /// The current number of elements in the buffer. - CORBA::ULong length_; - - /// The buffer with all the elements, casting must be done in derived - /// classes. - void *buffer_; - - /// If true then the sequence should release the buffer when it is - /// destroyed. - CORBA::Boolean release_; -}; - -// **************************************************************** - -/** - * @class TAO_Unbounded_Base_Sequence - * - * @brief Base class for all bounded sequences. - * - * This class implements part of the funcionality common to all - * bounded sequences, using this intermediate class instead of - * virtual methods on TAO_Base_Sequence give us a slight - * improvement of performance, but also reduces the amount of - * generated code in the templates. - */ -class TAO_Export TAO_Unbounded_Base_Sequence : public TAO_Base_Sequence -{ -public: - /** - * = SPEC {16.11.2} - * For an unbounded sequence, setting the length to a larger value - * than the current length may reallocate the sequence - * data. Reallocation is conceptually equivalent to creating a new - * sequence of the desired new length, copying the old sequence - * elements zero through length into the new sequence, and then - * assigning the old sequence to be the same as the new sequence. - */ - void length (CORBA::ULong length); - - /** - * return the current length, it cannot go into the base class due - * to the C++ name lookup rules (if you don't know what I'm talking - * about, then try moving it there). - */ - CORBA::ULong length (void) const; - - /// destructor. - virtual ~TAO_Unbounded_Base_Sequence (void); - -protected: - /// Default constructor. - TAO_Unbounded_Base_Sequence (void); - - /// Constructor with control of ownership. - TAO_Unbounded_Base_Sequence (CORBA::ULong maximum, - CORBA::ULong length, - void *buffer, - CORBA::Boolean release = 0); - - /// Assume ownership and set length to 0. - TAO_Unbounded_Base_Sequence (CORBA::ULong maximum, - void *buffer); -}; - -// **************************************************************** - -/** - * @class TAO_Bounded_Base_Sequence - * - * @brief Base class for all bounded sequences. - * - * This class implements part of the funcionality common to all - * bounded sequences, using this intermediate class instead of - * virtual methods on TAO_Base_Sequence give us a slight - * improvement of performance, but also reduces the amount of - * generated code in the templates. - */ -class TAO_Export TAO_Bounded_Base_Sequence : public TAO_Base_Sequence -{ -public: - /// Set the length, for this sequences this call is ignored if the - /// new length is greater that the maximum. - void length (CORBA::ULong length); - - /** - * Return the current length, it cannot go into the base class due - * to the C++ name lookup rules (if you don't know what I'm talking - * about, then try moving it there). - */ - CORBA::ULong length (void) const; - - /// Destructor. - virtual ~TAO_Bounded_Base_Sequence (void); - -protected: - /// Default constructor. - TAO_Bounded_Base_Sequence (void); - - /// Constructor with control of ownership. - TAO_Bounded_Base_Sequence (CORBA::ULong maximum, - CORBA::ULong length, - void *buffer, - CORBA::Boolean release = 0); - - /// Assume ownership and set length to 0. - TAO_Bounded_Base_Sequence (CORBA::ULong maximum, - void *buffer); -}; - -// **************************************************************** - -/** - * @class TAO_Unbounded_String_Sequence - * - * @brief Unbounded sequence of strings. - * - * IDL sequences of strings must automatically duplicate and - * release their members based on some global <release> flag. - */ -class TAO_Export TAO_Unbounded_String_Sequence - : public TAO_Unbounded_Base_Sequence -{ - - // = SPEC - // 16.8 Mapping for Structured Types - // The mapping for struct, union, and sequence (but not array) is a - // C++ struct or class with a default constructor, a copy - // constructor, an assignment operator, and a destructor. - // -public: - // = Operations for the Unbounded_ObjectSequence - - /** - * {orbos/97-05-15:16.8} - * The default constructor initializes object reference members to - * appropriately typed nil object references and string members to - * NULL; all other members are initialized via their default - * constructors. - * - * {orbos/97-05-15:16.11} - * For both bounded and unbounded sequences, the default constructor - * (as shown in the example above) sets the sequence length equal to - * 0. - */ - TAO_Unbounded_String_Sequence (void); - - /** - * Unbounded sequences provide a constructor that allows only the - * initial value of the maximum length to be set (the ``maximum - * constructor'' shown in the example above). This allows - * applications to control how much buffer space is initially - * allocated by the sequence. This constructor also sets the length - * to 0 and the release flag to TRUE. - */ - TAO_Unbounded_String_Sequence (CORBA::ULong maximum); - - /** - * The ``T *data'' constructor (as shown in the example above) - * allows the length and contents of a bounded or unbounded sequence - * to be set. For unbounded sequences, it also allows the initial - * value of the maximum length to be set. For this constructor, - * ownership of the content's vector is determined by the release - * parameter---FALSE means the caller owns the storage, while TRUE - * means that the sequence assumes ownership of the storage. - * If release is TRUE, the content's vector must have been allocated - * using the sequence allocbuf function, and the sequence will pass - * it to freebuf when finished with it. - */ - TAO_Unbounded_String_Sequence (CORBA::ULong maximum, - CORBA::ULong length, - char ** data, - CORBA::Boolean release = 0); - - /** - * The copy constructor performs a deep copy from the existing - * structure to create a new structure, including calling _duplicate - * on all object reference members and performing the necessary - * heap allocations for all string members. - * - * The copy constructor creates a new sequence with the same maximum - * and length as the given sequence, copies each of its current - * elements (items zero through length-1), and sets the release - * flag to TRUE. - */ - TAO_Unbounded_String_Sequence(const TAO_Unbounded_String_Sequence&); - - /// The destructor releases all object reference members and frees - /// all string members. - ~TAO_Unbounded_String_Sequence (void); - - /** - * The assignment operator first releases all object reference - * members and frees all string members, and then performs a - * deepcopy to create a new structure. - * - * The assignment operator deepcopies its parameter, releasing - * old storage if necessary. It behaves as if the original sequence - * is destroyed via its destructor and then the source sequence - * copied using the copy constructor. If release=TRUE, the - * destructor destroys each of the current elements (items zero - * through length--1). - * For an unbounded sequence, if a reallocation is necessary due to - * a change in the length and the sequence was created using the - * release=TRUE parameter in its constructor, the sequence will - * deallocate the old storage. If release is FALSE under these - * circumstances, old storage will not be freed before the - * reallocation is performed. After reallocation, the release flag - * is always set to TRUE. - */ - TAO_Unbounded_String_Sequence & operator= ( - const TAO_Unbounded_String_Sequence & - ); - - /// read-write accessor - TAO_SeqElem_String_Manager operator[] (CORBA::ULong slot) const; - - /** - * The allocbuf function allocates a vector of T elements that can - * be passed to the T *data constructor. The length of the vector is - * given by the nelems function argument. The allocbuf function - * initializes each element using its default constructor, except - * for strings, which are initialized to null pointers, and object - * references, which are initialized to suitably typed nil object - * references. A null pointer is returned if allocbuf for some - * reason cannot allocate the requested vector. Vectors allocated by - * allocbuf should be freed using the freebuf function. - */ - static char ** allocbuf (CORBA::ULong); - - /** - * The freebuf function ensures that the destructor for each element - * is called before the buffer is destroyed, except for string - * elements, which are freed using string_free(), and object - * reference elements, which are freed using release(). The freebuf - * function will ignore null pointers passed to it. - */ - static void freebuf (char **); - - static void _tao_any_destructor (void *); - - // = Fast buffer accessors. - char ** get_buffer (CORBA::Boolean orphan = 0); - const char ** get_buffer (void) const; - - // Functions to create, destroy, and adjust the underlying buffer. - virtual void _allocate_buffer (CORBA::ULong length); - virtual void _deallocate_buffer (void); - virtual void _shrink_buffer (CORBA::ULong new_length, - CORBA::ULong old_length); - - // Parameters work the same as in constructor of the same signature. - void replace (CORBA::ULong maximum, - CORBA::ULong length, - char ** data, - CORBA::Boolean release = 0); -}; - -// **************************************************************** - -/** - * @class TAO_Unbounded_WString_Sequence - * - * @brief Unbounded sequence of wstrings. - * - * IDL sequences of wstrings must automatically duplicate and - * release their members based on some global <release> flag. - */ -class TAO_Export TAO_Unbounded_WString_Sequence - : public TAO_Unbounded_Base_Sequence -{ - - // = SPEC - // 16.8 Mapping for Structured Types - // The mapping for struct, union, and sequence (but not array) is a - // C++ struct or class with a default constructor, a copy - // constructor, an assignment operator, and a destructor. - // -public: - // = Operations for the Unbounded_ObjectSequence - - /** - * {orbos/97-05-15:16.8} - * The default constructor initializes object reference members to - * appropriately typed nil object references and wstring members to - * NULL; all other members are initialized via their default - * constructors. - * - * {orbos/97-05-15:16.11} - * For both bounded and unbounded sequences, the default constructor - * (as shown in the example above) sets the sequence length equal to - * 0. - */ - TAO_Unbounded_WString_Sequence (void); - - /** - * Unbounded sequences provide a constructor that allows only the - * initial value of the maximum length to be set (the ``maximum - * constructor'' shown in the example above). This allows - * applications to control how much buffer space is initially - * allocated by the sequence. This constructor also sets the length - * to 0 and the release flag to TRUE. - */ - TAO_Unbounded_WString_Sequence (CORBA::ULong maximum); - - /** - * The ``T *data'' constructor (as shown in the example above) - * allows the length and contents of a bounded or unbounded sequence - * to be set. For unbounded sequences, it also allows the initial - * value of the maximum length to be set. For this constructor, - * ownership of the contents vector is determined by the release - * parameter---FALSE means the caller owns the storage, while TRUE - * means that the sequence assumes ownership of the storage. - * If release is TRUE, the contents vector must have been allocated - * using the sequence allocbuf function, and the sequence will pass - * it to freebuf when finished with it. - */ - TAO_Unbounded_WString_Sequence (CORBA::ULong maximum, - CORBA::ULong length, - CORBA::WChar ** data, - CORBA::Boolean release = 0); - - /** - * The copy constructor performs a deep copy from the existing - * structure to create a new structure, including calling _duplicate - * on all object reference members and performing the necessary - * heap allocations for all string members. - * - * The copy constructor creates a new sequence with the same maximum - * and length as the given sequence, copies each of its current - * elements (items zero through length-1), and sets the release - * flag to TRUE. - */ - TAO_Unbounded_WString_Sequence (const TAO_Unbounded_WString_Sequence &); - - /// The destructor releases all object reference members and frees - /// all string members. - ~TAO_Unbounded_WString_Sequence (void); - - /** - * The assignment operator first releases all object reference - * members and frees all wstring members, and then performs a - * deepcopy to create a new structure. - * - * The assignment operator deepcopies its parameter, releasing - * old storage if necessary. It behaves as if the original sequence - * is destroyed via its destructor and then the source sequence - * copied using the copy constructor. If release=TRUE, the - * destructor destroys each of the current elements (items zero - * through length--1). - * For an unbounded sequence, if a reallocation is necessary due to - * a change in the length and the sequence was created using the - * release=TRUE parameter in its constructor, the sequence will - * deallocate the old storage. If release is FALSE under these - * circumstances, old storage will not be freed before the - * reallocation is performed. After reallocation, the release flag - * is always set to TRUE. - */ - TAO_Unbounded_WString_Sequence & operator= ( - const TAO_Unbounded_WString_Sequence & - ); - - /// Read-write accessor - TAO_SeqElem_WString_Manager operator[] (CORBA::ULong slot) const; - - /** - * The allocbuf function allocates a vector of T elements that can - * be passed to the T *data constructor. The length of the vector is - * given by the nelems function argument. The allocbuf function - * initializes each element using its default constructor, except - * for strings, which are initialized to null pointers, and object - * references, which are initialized to suitably typed nil object - * references. A null pointer is returned if allocbuf for some - * reason cannot allocate the requested vector. Vectors allocated by - * allocbuf should be freed using the freebuf function. - */ - static CORBA::WChar ** allocbuf (CORBA::ULong); - - /** - * The freebuf function ensures that the destructor for each element - * is called before the buffer is destroyed, except for string - * elements, which are freed using wstring_free(), and object - * reference elements, which are freed using release(). The freebuf - * function will ignore null pointers passed to it. - */ - static void freebuf (CORBA::WChar **); - - static void _tao_any_destructor (void *); - - // = Fast buffer accessors. - CORBA::WChar ** get_buffer (CORBA::Boolean orphan = 0); - const CORBA::WChar ** get_buffer (void) const; - - // Functions to create, destroy, and adjust the underlying buffer. - virtual void _allocate_buffer (CORBA::ULong length); - virtual void _deallocate_buffer (void); - virtual void _shrink_buffer (CORBA::ULong new_length, - CORBA::ULong old_length); - - // Parameters work the same as in constructor of the same signature. - void replace (CORBA::ULong maximum, - CORBA::ULong length, - CORBA::WChar ** data, - CORBA::Boolean release = 0); -}; - -// **************************************************************** - -// forward declaration, we are going to specialize that template -// here. -// The template itself requires this file so every user of the -// template should also see the specialization. -template<class T> class TAO_Unbounded_Sequence; - -/** - * @class TAO_Unbounded_Sequence<CORBA::Octet> - * - * @brief An unbounded sequence of Octets - * - * Marshalling and demarshalling octet sequences can be highly - * optimize, for instance at demarshalling we don't require a copy - * from the CDR buffer to the octet sequence buffer, we can simply - * hold a duplicate of the underlying ACE_Message_Block. - * Specializing the TAO_Unbounded_Sequence<T> parametric - * class, is an excellent way to achieve this optimizations. - */ -template<> -class TAO_Export TAO_Unbounded_Sequence<CORBA::Octet> - : public TAO_Unbounded_Base_Sequence -{ -public: - /// For efficient marshalling and demarshalling. - friend class TAO_Marshal_Sequence; - - /// see TAO_Unbounded_Sequence in "Sequence_T.h" - TAO_Unbounded_Sequence (void); - TAO_Unbounded_Sequence (CORBA::ULong max); - TAO_Unbounded_Sequence (CORBA::ULong max, - CORBA::ULong length, - CORBA::Octet *data, - CORBA::Boolean release = 0); - virtual ~TAO_Unbounded_Sequence (void); - - /// Use in the implementation of insertion and extraction operators - /// from CORBA::Any - static void _tao_any_destructor (void*); - - /** - * The copy constructor and assignment operators *do* copy the data, - * though we could simply duplicate the ref count in the - * ACE_Message_Block this will change the semantics for this - * operations. - */ - TAO_Unbounded_Sequence (const TAO_Unbounded_Sequence<CORBA::Octet> &); - TAO_Unbounded_Sequence<CORBA::Octet>& operator= ( - const TAO_Unbounded_Sequence<CORBA::Octet> & - ); - - /** - * See the general description in "Sequence_T.h" - * NOTE: This last two methods can be rendered useless in certain - * cases, see below. - */ - CORBA::Octet &operator[] (CORBA::ULong); - const CORBA::Octet &operator[] (CORBA::ULong) const; - - // = Static operations. - - /// Allocate storage for the sequence, please note that the storage - /// is always held in a ACE_Message_Block. - static CORBA::Octet *allocbuf (CORBA::ULong); - - /// Free the storage. - static void freebuf (CORBA::Octet *); - - /// Implement the methods for all the sequence, please see - /// TAO_Base_Sequence. - virtual void _allocate_buffer (CORBA::ULong length); - virtual void _deallocate_buffer (void); - - // = Fast buffer accessors. - CORBA::Octet *get_buffer (CORBA::Boolean orphan = 0); - const CORBA::Octet *get_buffer (void) const; - - // NOTE: This last two methods can be rendered useless in certain - // cases, see below. - /// See the general description of this methods in "Sequence_T.h". - void replace (CORBA::ULong max, - CORBA::ULong length, - CORBA::Octet *data, - CORBA::Boolean release = 0); - - // = TAO extensions - -#if (TAO_NO_COPY_OCTET_SEQUENCES == 1) - - /// Returns the underlying message block, the caller must *not* - /// release the copy. - ACE_Message_Block* mb (void) const; - - /// Create a sequence of octets from a single message block (i.e. it - /// ignores any chaining in the meesage block). - TAO_Unbounded_Sequence (CORBA::ULong length, - const ACE_Message_Block* mb); - - /// Replaces the current buffer with <mb>, using only <length> bytes. - /// It takes a duplicate of <mb> so the user still owns it. - void replace (CORBA::ULong length, const ACE_Message_Block* mb); - - // - // NOTE: - // In the last two methods if the <mb> is the head of a chain then - // the following methods are not warranteed to work properly: - // operator[] - // get_buffer () - // the main purpose of this method is to support custom marshaling; - // so the complete chain is marshaled when the octet sequence is. - // - -private: - ACE_Message_Block* mb_; -#endif /* TAO_NO_COPY_OCTET_SEQUENCES == 1 */ -}; - -// **************************************************************** - -// Comparison of octet sequence. -TAO_Export bool operator== (const TAO_Unbounded_Sequence<CORBA::Octet> &l, - const TAO_Unbounded_Sequence<CORBA::Octet> &r); - -TAO_Export bool operator!= (const TAO_Unbounded_Sequence<CORBA::Octet> &l, - const TAO_Unbounded_Sequence<CORBA::Octet> &r); - -// **************************************************************** - -TAO_END_VERSIONED_NAMESPACE_DECL - -/** - * @brief Safe assertions without including Log_Msg.h - */ -#define TAO_SEQUENCE_ASSERT(TAO_IDX,TAO_MAX) \ - this->check_bounds(__FILE__, __LINE__, (TAO_IDX), (TAO_MAX)) - - -#if defined (__ACE_INLINE__) -#include "tao/Sequence.i" -#endif /* __ACE_INLINE__ */ - -#include "tao/Sequence_T.h" - -#include /**/ "ace/post.h" - -#endif /* TAO_SEQUENCE_H */ |