diff options
Diffstat (limited to 'TAO/tao/sequence.h')
-rw-r--r-- | TAO/tao/sequence.h | 357 |
1 files changed, 357 insertions, 0 deletions
diff --git a/TAO/tao/sequence.h b/TAO/tao/sequence.h new file mode 100644 index 00000000000..8cef2a2fce6 --- /dev/null +++ b/TAO/tao/sequence.h @@ -0,0 +1,357 @@ +/* -*- C++ -*- */ +// $Id$ + +// ============================================================================ +// +// = LIBRARY +// TAO +// +// = FILENAME +// sequence.h +// +// = AUTHOR +// +// Carlos O'Ryan and Aniruddha Gokhale +// +// ============================================================================ + +#if !defined (TAO_SEQUENCE_H) +# define TAO_SEQUENCE_H + +class TAO_Export TAO_Base_Sequence +{ + // = TITLE + // Base class for TAO sequences. + // + // = DESCRIPTION + // This class provides a common interface for all IDL sequences, + // hence the interpreted marshal engine can manipulate them in a + // type safe manner. +public: + friend class TAO_Marshal_Sequence; + // We give access to TAO_Marshal_Sequence, this allows a safe yet + // small footprint implementation of the marshal engine. + + virtual ~TAO_Base_Sequence (void); + // destructor. + + CORBA::ULong maximum (void) const; + // return the maximum length of the sequence + + virtual void _allocate_buffer (CORBA::ULong length) = 0; + // 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 _deallocate_buffer (void) = 0; + // Must deallocate the buffer and then set it to zero. + + virtual void _shrink_buffer (CORBA::ULong new_length, + CORBA::ULong old_length); + // 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. + +protected: + TAO_Base_Sequence (void); + // Default constructor. + + TAO_Base_Sequence (CORBA::ULong maximum, + CORBA::ULong length, + void *buffer, + CORBA::Boolean release = CORBA::B_FALSE); + // Constructor with control of ownership. + + TAO_Base_Sequence (CORBA::ULong maximum, + void *buffer); + // Assume ownership and set length to 0. + + TAO_Base_Sequence (const TAO_Base_Sequence &rhs); + TAO_Base_Sequence &operator= (const TAO_Base_Sequence &rhs); + // 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. + + // = orbos/98-01-11 proposed extensions. + CORBA::Boolean release (void) const; + // Returns the state of the sequence release flag. + +protected: + CORBA::ULong maximum_; + // The maximum number of elements the buffer can contain. + + CORBA::ULong length_; + // The current number of elements in the buffer. + + void *buffer_; + // The buffer with all the elements, casting must be done in derived + // classes. + + CORBA::Boolean release_; + // If true then the sequence should release the buffer when it is + // destroyed. +}; + +class TAO_Export TAO_Unbounded_Base_Sequence : public TAO_Base_Sequence +{ + // = TITLE + // Base class for all bounded sequences. + // + // = DESCRIPTION + // 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. +public: + void length (CORBA::ULong length); + // = 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. + + CORBA::ULong length (void) const; + // 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). + +protected: + TAO_Unbounded_Base_Sequence (void); + // Default constructor. + + virtual ~TAO_Unbounded_Base_Sequence (void); + // destructor. + + TAO_Unbounded_Base_Sequence (CORBA::ULong maximum, + CORBA::ULong length, + void *buffer, + CORBA::Boolean release = 0); + // Constructor with control of ownership. + + TAO_Unbounded_Base_Sequence (CORBA::ULong maximum, + void *buffer); + // Assume ownership and set length to 0. +}; + +class TAO_Export TAO_Bounded_Base_Sequence : public TAO_Base_Sequence +{ + // = TITLE + // Base class for all bounded sequences. + // + // = DESCRIPTION + // 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. +public: + void length (CORBA::ULong length); + // set the length, for this sequences this call is ignored if the + // new length is greater that the maximum. + + CORBA::ULong length (void) const; + // 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). + +protected: + TAO_Bounded_Base_Sequence (void); + // Default constructor. + + virtual ~TAO_Bounded_Base_Sequence (void); + // destructor. + + TAO_Bounded_Base_Sequence (CORBA::ULong maximum, + CORBA::ULong length, + void *buffer, + CORBA::Boolean release = 0); + // Constructor with control of ownership. + + TAO_Bounded_Base_Sequence (CORBA::ULong maximum, + void *buffer); + // Assume ownership and set length to 0. +}; + +/****************************************************************/ + +class TAO_Export TAO_String_Manager +{ + // = TITLE + // Manager for strings. + // + // = DESCRIPTION + // Similar to the mapping for sequences of objects (and other + // pseudo objects) the mapping for sequences of strings requires + // an auxiliar class or <Manager> to handle the allocation and + // deallocation of the string. The main difference with respect + // to String_var classes is that automatic release is not + // controlled on a per-item basis, but for the sequence as a + // whole. The difference wrt Object_Manager is that strings are + // duplicated using CORBA::string_copy() as opposed to + // T::_duplicate(), and released using CORBA::string_free() + // instead of CORBA::release() + // + // This class implements the generic string manager and is used to + // instantiate the proper sequence types. + // +public: + friend class TAO_Unbounded_String_Sequence; + + // @@ Giving friendship to a template is not implemented on several + // compilers: + // friend template<CORBA::ULong MAX> + // class TAO_Bounded_String_Sequence<TAO_String_Manager,MAX>; + + TAO_String_Manager (const TAO_String_Manager &); + // copy constructor + + TAO_String_Manager (char **buffer, CORBA::Boolean release); + // constructor from address of an element + + ~TAO_String_Manager (void); + // destructor + + TAO_String_Manager &operator= (const TAO_String_Manager&); + // assignment from another managed type + + TAO_String_Manager &operator= (const char *); + // assignment from a constant char* + + operator const char*() const; + // cast (read-only) + +private: + char **ptr_; + // Address of string element from the parent's buffer. + + CORBA::Boolean release_; + // control memory managment semantics. +}; + +class TAO_Export TAO_Unbounded_String_Sequence : public TAO_Unbounded_Base_Sequence +{ + // =TITLE + // Unbounded sequence of strings. + // + // =DESCRIPTION + // IDL sequences of strings must automatically duplicate and + // release their members based on some global <release> flag. + + // = 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: + typedef TAO_String_Manager Manager; + + // =operations for the Unbounded_ObjectSequence + + TAO_Unbounded_String_Sequence (void); + // {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 (CORBA::ULong maximum); + // 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, + CORBA::ULong length, + char **data, + CORBA::Boolean release=0); + // 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_String_Sequence(const TAO_Unbounded_String_Sequence&); + // 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 (void); + // The destructor releases all object reference members and frees + // all string members. + + TAO_Unbounded_String_Sequence &operator= (const TAO_Unbounded_String_Sequence &); + // 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. + + Manager operator[] (CORBA::ULong index) const; + // read-write accessor + + static char* *allocbuf (CORBA::ULong); + // 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 void freebuf (char **); + // 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. + + virtual void _allocate_buffer (CORBA::ULong length); + virtual void _deallocate_buffer (void); + virtual void _shrink_buffer (CORBA::ULong new_length, + CORBA::ULong old_length); +}; + +#if defined (__ACE_INLINE__) +#include "tao/sequence.i" +#endif /* __ACE_INLINE__ */ + +#endif /* TAO_SEQUENCE_H */ |