// -*- c++ -*- /* * MICO --- an Open Source CORBA implementation * Copyright (c) 1997-2005 by The Mico Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * For more information, visit the MICO Home Page at * http://www.mico.org/ */ #ifndef __MICO_TEMPLATE_IMPL_H__ #define __MICO_TEMPLATE_IMPL_H__ /* * The following declarations belong to the ObjVar and * SequenceIndTmpl template. * The reason they are defined here is that these particular * methods make reference to interface methods (like _nil(), * _release(), etc) which are not known at the time these * templates are being used. */ //----- ObjVar implementations --------------------------------------------- template T * ObjVar::duplicate (T *t) { return T::_duplicate (t); } template void ObjVar::release (T *t) { ::CORBA::release (t); } //----- ObjOut implementations --------------------------------------------- template ObjOut::ObjOut (T*& p) : _ptr (p) { _ptr = T::_nil(); } template ObjOut::ObjOut (ObjVar& p) : _ptr (p._ptr) { CORBA::release (_ptr); _ptr = T::_nil(); } template ObjOut& ObjOut::operator= (const ObjVar& p) { _ptr = T::_duplicate (p._ptr); return *this; } //----- ValueVar implementations ------------------------------------------- template T * ValueVar::duplicate (T *t) { if (t) t->_add_ref(); return t; } template void ValueVar::release (T *t) { if (t) t->_remove_ref(); } //----- SequenceIndTmpl implementations ------------------------------------ template SequenceIndTmpl::SequenceIndTmpl (MICO_ULong maxval, MICO_ULong lengthval, T* value, MICO_Boolean rel) { assert (lengthval <= maxval); vec.reserve (maxval); for (MICO_ULong i = 0; i < lengthval; ++i) { T_elem* new_elem = new T_elem[ n ]; T_elem* dest = new_elem; T_elem* src = (T_elem*) (value + i); MICO_ULong j = 0; while( j < n ) { *dest = *src; ++dest; ++src; j++; } vec.push_back ( new_elem ); } if (rel) freebuf (value); } template void SequenceIndTmpl::replace (MICO_ULong maxval, MICO_ULong lengthval, T* value, MICO_Boolean rel) { assert (lengthval <= maxval); for( mico_vec_size_type i0 = 0; i0 < vec.size(); i0++ ) delete[] vec[ i0 ]; vec.erase (vec.begin(), vec.end()); vec.reserve (maxval); for (MICO_ULong i1 = 0; i1 < lengthval; ++i1) { T_elem* new_elem = new T_elem[ n ]; T_elem* dest = new_elem; T_elem* src = (T_elem*) (value + i1); MICO_ULong j = 0; while( j < n ) { *dest = *src; ++dest; ++src; j++; } vec.push_back ( new_elem ); } if (rel) freebuf (value); } template SequenceIndTmpl:: SequenceIndTmpl (const SequenceIndTmpl &s) { for( CORBA::ULong i = 0; i < s.length(); i++ ) { T_elem* new_elem = new T_elem[ n ]; T_elem* dest = new_elem; T_elem* src = s.vec[ i ]; MICO_ULong j = 0; while( j < n ) { *dest = *src; ++dest; ++src; j++; } vec.push_back ( new_elem ); } } template SequenceIndTmpl::~SequenceIndTmpl () { for( mico_vec_size_type i = 0; i < vec.size(); i++ ) delete[] vec[ i ]; } template SequenceIndTmpl& SequenceIndTmpl::operator= (const SequenceIndTmpl &s) { for( mico_vec_size_type i0 = 0; i0 < vec.size(); i0++ ) delete[] vec[ i0 ]; vec.erase( vec.begin(), vec.end() ); for( MICO_ULong i1 = 0; i1 < s.length(); i1++ ) { T_elem* new_elem = new T_elem[ n ]; T_elem* dest = new_elem; T_elem* src = s.vec[ i1 ]; MICO_ULong j = 0; while( j < n ) { *dest = *src; ++dest; ++src; j++; } vec.push_back ( new_elem ); } return *this; } template void SequenceIndTmpl::length (MICO_ULong l) { if (l < vec.size ()) { for( mico_vec_size_type i = l; i < vec.size(); i++ ) delete[] vec[ i ]; vec.erase (vec.begin() + l, vec.end()); } else if (l > vec.size()) { int limit = l - vec.size(); for( int i = 0; i < limit; i++ ) vec.push_back( new T_elem[ n ] ); } } template T* SequenceIndTmpl::allocbuf (MICO_ULong len) { return (T*) new T_elem[ n * len ]; } template void SequenceIndTmpl::freebuf( T* b ) { delete[] (T_elem*) b; } //----- BoundedSequenceIndTmpl implementations ----------------------------- template BoundedSequenceIndTmpl:: BoundedSequenceIndTmpl (MICO_ULong lengthval, T *value, MICO_Boolean rel) { assert (lengthval <= max); vec.reserve (max); for (MICO_ULong i = 0; i < lengthval; ++i) { T_elem* new_elem = new T_elem[ n ]; T_elem* dest = new_elem; T_elem* src = (T_elem*) (value + i); MICO_ULong j = 0; while( j < n ) { *dest = *src; ++dest; ++src; j++; } vec.push_back ( new_elem ); } if (rel) freebuf (value); } template void BoundedSequenceIndTmpl::replace (MICO_ULong lengthval, T *value, MICO_Boolean rel) { assert (lengthval <= max); for( mico_vec_size_type i0 = 0; i0 < vec.size(); i0++ ) delete[] vec[ i0 ]; vec.erase (vec.begin(), vec.end()); vec.reserve (max); for (MICO_ULong i1 = 0; i1 < lengthval; ++i1) { T_elem* new_elem = new T_elem[ n ]; T_elem* dest = new_elem; T_elem* src = (T_elem*) (value + i1); MICO_ULong j = 0; while( j < n ) { *dest = *src; ++dest; ++src; j++; } vec.push_back ( new_elem ); } if (rel) freebuf (value); } template BoundedSequenceIndTmpl:: BoundedSequenceIndTmpl (const BoundedSequenceIndTmpl &s) { vec.reserve( max ); for( CORBA::ULong i = 0; i < s.length(); i++ ) { T_elem* new_elem = new T_elem[ n ]; T_elem* dest = new_elem; T_elem* src = s.vec[ i ]; MICO_ULong j = 0; while( j < n ) { *dest = *src; ++dest; ++src; j++; } vec.push_back ( new_elem ); } } template BoundedSequenceIndTmpl::~BoundedSequenceIndTmpl () { for( mico_vec_size_type i = 0; i < vec.size(); i++ ) delete[] vec[ i ]; } template BoundedSequenceIndTmpl & BoundedSequenceIndTmpl:: operator= (const BoundedSequenceIndTmpl &s) { for( mico_vec_size_type i0 = 0; i0 < vec.size(); i0++ ) delete[] vec[ i0 ]; vec.erase( vec.begin(), vec.end() ); for( MICO_ULong i1 = 0; i1 < s.length(); i1++ ) { T_elem* new_elem = new T_elem[ n ]; T_elem* dest = new_elem; T_elem* src = s.vec[ i1 ]; MICO_ULong j = 0; while( j < n ) { *dest = *src; ++dest; ++src; j++; } vec.push_back ( new_elem ); } return *this; } template void BoundedSequenceIndTmpl::length (MICO_ULong l) { assert (l <= max); if (l < vec.size ()) { for( mico_vec_size_type i = l; i < vec.size(); i++ ) delete[] vec[ i ]; vec.erase (vec.begin() + l, vec.end()); } else if (l > vec.size()) { int limit = l - vec.size(); for( int i = 0; i < limit; i++ ) vec.push_back( new T_elem[ n ] ); } } template T* BoundedSequenceIndTmpl::allocbuf (MICO_ULong len) { return (T*) new T_elem[ n * len ]; } template void BoundedSequenceIndTmpl::freebuf (T *b) { delete[] (T_elem*) b; } #endif