www.pudn.com > ACE-5.3 > Array_Base.cpp, change:2002-07-07,size:5141b


// Array_Base.cpp,v 4.3 2002/07/07 15:42:02 schmidt Exp 
 
#ifndef ACE_ARRAY_BASE_C 
#define ACE_ARRAY_BASE_C 
 
#include "ace/Malloc_Base.h" 
#include "ace/Array_Base.h" 
 
#if !defined (ACE_LACKS_PRAGMA_ONCE) 
# pragma once 
#endif /* ACE_LACKS_PRAGMA_ONCE */ 
 
#if !defined (__ACE_INLINE__) 
#include "ace/Array_Base.inl" 
#endif /* __ACE_INLINE__ */ 
 
ACE_RCSID(ace, Array_Base, "Array_Base.cpp,v 4.3 2002/07/07 15:42:02 schmidt Exp") 
 
 
// Dynamically initialize an array. 
 
template <class T> 
ACE_Array_Base<T>::ACE_Array_Base (size_t size, 
                                   ACE_Allocator *alloc) 
  : max_size_ (size), 
    cur_size_ (size), 
    allocator_ (alloc) 
{ 
  if (this->allocator_ == 0) 
    this->allocator_ = ACE_Allocator::instance (); 
 
  if (size != 0) 
    { 
      ACE_ALLOCATOR (this->array_, 
                     (T *) this->allocator_->malloc (size * sizeof (T))); 
      for (size_t i = 0; i  size; ++i) 
        new (&array_[i]) T; 
    } 
  else 
    this->array_ = 0; 
} 
 
template <class T> 
ACE_Array_Base<T>::ACE_Array_Base (size_t size, 
                                   const T &default_value, 
                                   ACE_Allocator *alloc) 
  : max_size_ (size), 
    cur_size_ (size), 
    allocator_ (alloc) 
{ 
  if (this->allocator_ == 0) 
    this->allocator_ = ACE_Allocator::instance (); 
 
  if (size != 0) 
    { 
      ACE_ALLOCATOR (this->array_, 
                     (T *) this->allocator_->malloc (size * sizeof (T))); 
      for (size_t i = 0; i  size; ++i) 
        new (&array_[i]) T (default_value); 
    } 
  else 
    this->array_ = 0; 
} 
 
// The copy constructor (performs initialization). 
 
template <class T> 
ACE_Array_Base<T>::ACE_Array_Base (const ACE_Array_Base<T> &s) 
  : max_size_ (s.size ()), 
    cur_size_ (s.size ()), 
    allocator_ (s.allocator_) 
{ 
  if (this->allocator_ == 0) 
    this->allocator_ = ACE_Allocator::instance (); 
 
  ACE_ALLOCATOR (this->array_, 
                 (T *) this->allocator_->malloc (s.size () * sizeof (T))); 
  for (size_t i = 0; i  this->size (); i++) 
    new (&this->array_[i]) T (s.array_[i]); 
} 
 
// Assignment operator (performs assignment). 
 
template <class T> void 
ACE_Array_Base<T>::operator= (const ACE_Array_Base<T> &s) 
{ 
  // Check for "self-assignment". 
 
  if (this != &s) 
    { 
      if (this->max_size_  s.size ()) 
        { 
          ACE_DES_ARRAY_FREE (this->array_, 
                              this->max_size_, 
                              this->allocator_->free, 
                              T); 
          ACE_ALLOCATOR (this->array_, 
                         (T *) this->allocator_->malloc (s.size () * sizeof (T))); 
          this->max_size_ = s.size (); 
        } 
      else 
        { 
          ACE_DES_ARRAY_NOFREE (this->array_, 
                                s.size (), 
                                T); 
        } 
 
      this->cur_size_ = s.size (); 
 
      for (size_t i = 0; i  this->size (); i++) 
        new (&this->array_[i]) T (s.array_[i]); 
    } 
} 
 
// Set an item in the array at location slot. 
 
template <class T> int 
ACE_Array_Base<T>::set (const T &new_item, size_t slot) 
{ 
  if (this->in_range (slot)) 
    { 
      this->array_[slot] = new_item; 
      return 0; 
    } 
  else 
    return -1; 
} 
 
// Get an item in the array at location slot. 
 
template <class T> int 
ACE_Array_Base<T>::get (T &item, size_t slot) const 
{ 
  if (this->in_range (slot)) 
    { 
      // Copies the item.  If you don't want to copy, use operator [] 
      // instead (but then you'll be responsible for range checking). 
      item = this->array_[slot]; 
      return 0; 
    } 
  else 
    return -1; 
} 
 
template<class T> int 
ACE_Array_Base<T>::max_size (size_t new_size) 
{ 
  if (new_size > this->max_size_) 
    { 
      T *tmp; 
 
      ACE_ALLOCATOR_RETURN (tmp, 
                            (T *) this->allocator_->malloc (new_size * sizeof (T)), 
                            -1); 
      for (size_t i = 0; i  this->cur_size_; ++i) 
        new (&tmp[i]) T (this->array_[i]); 
 
      // Initialize the new portion of the array that exceeds the 
      // previously allocated section. 
      for (size_t j = this->cur_size_; j  new_size; j++) 
        new (&tmp[j]) T; 
 
      ACE_DES_ARRAY_FREE (this->array_, 
                          this->max_size_, 
                          this->allocator_->free, 
                          T); 
      this->array_ = tmp; 
      this->max_size_ = new_size; 
      this->cur_size_ = new_size; 
    } 
 
  return 0; 
} 
 
template<class T> int 
ACE_Array_Base<T>::size (size_t new_size) 
{ 
  int r = this->max_size (new_size); 
  if (r != 0) 
    return r; 
  this->cur_size_ = new_size; 
  return 0; 
} 
 
// **************************************************************** 
 
template <class T> int 
ACE_Array_Iterator<T>::next (T *&item) 
{ 
  // ACE_TRACE ("ACE_Array_Iterator<T>::next"); 
 
  if (this->done ()) 
    { 
      item = 0; 
      return 0; 
    } 
  else 
    { 
      item = &array_[current_]; 
      return 1; 
    } 
} 
 
#endif /* ACE_ARRAY_BASE_C */