112027Sjungma@eit.uni-kl.de/***************************************************************************** 212027Sjungma@eit.uni-kl.de 312027Sjungma@eit.uni-kl.de Licensed to Accellera Systems Initiative Inc. (Accellera) under one or 412027Sjungma@eit.uni-kl.de more contributor license agreements. See the NOTICE file distributed 512027Sjungma@eit.uni-kl.de with this work for additional information regarding copyright ownership. 612027Sjungma@eit.uni-kl.de Accellera licenses this file to you under the Apache License, Version 2.0 712027Sjungma@eit.uni-kl.de (the "License"); you may not use this file except in compliance with the 812027Sjungma@eit.uni-kl.de License. You may obtain a copy of the License at 912027Sjungma@eit.uni-kl.de 1012027Sjungma@eit.uni-kl.de http://www.apache.org/licenses/LICENSE-2.0 1112027Sjungma@eit.uni-kl.de 1212027Sjungma@eit.uni-kl.de Unless required by applicable law or agreed to in writing, software 1312027Sjungma@eit.uni-kl.de distributed under the License is distributed on an "AS IS" BASIS, 1412027Sjungma@eit.uni-kl.de WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 1512027Sjungma@eit.uni-kl.de implied. See the License for the specific language governing 1612027Sjungma@eit.uni-kl.de permissions and limitations under the License. 1712027Sjungma@eit.uni-kl.de 1812027Sjungma@eit.uni-kl.de *****************************************************************************/ 1912027Sjungma@eit.uni-kl.de 2012027Sjungma@eit.uni-kl.de/***************************************************************************** 2112027Sjungma@eit.uni-kl.de 2212027Sjungma@eit.uni-kl.de scfx_mant.h - 2312027Sjungma@eit.uni-kl.de 2412027Sjungma@eit.uni-kl.de Original Author: Robert Graulich, Synopsys, Inc. 2512027Sjungma@eit.uni-kl.de Martin Janssen, Synopsys, Inc. 2612027Sjungma@eit.uni-kl.de 2712027Sjungma@eit.uni-kl.de *****************************************************************************/ 2812027Sjungma@eit.uni-kl.de 2912027Sjungma@eit.uni-kl.de/***************************************************************************** 3012027Sjungma@eit.uni-kl.de 3112027Sjungma@eit.uni-kl.de MODIFICATION LOG - modifiers, enter your name, affiliation, date and 3212027Sjungma@eit.uni-kl.de changes you are making here. 3312027Sjungma@eit.uni-kl.de 3412027Sjungma@eit.uni-kl.de Name, Affiliation, Date: 3512027Sjungma@eit.uni-kl.de Description of Modification: 3612027Sjungma@eit.uni-kl.de 3712027Sjungma@eit.uni-kl.de *****************************************************************************/ 3812027Sjungma@eit.uni-kl.de 3912027Sjungma@eit.uni-kl.de// $Log: scfx_mant.h,v $ 4012027Sjungma@eit.uni-kl.de// Revision 1.2 2011/08/24 22:05:43 acg 4112027Sjungma@eit.uni-kl.de// Torsten Maehne: initialization changes to remove warnings. 4212027Sjungma@eit.uni-kl.de// 4312027Sjungma@eit.uni-kl.de// Revision 1.1.1.1 2006/12/15 20:20:04 acg 4412027Sjungma@eit.uni-kl.de// SystemC 2.3 4512027Sjungma@eit.uni-kl.de// 4612027Sjungma@eit.uni-kl.de// Revision 1.3 2006/01/13 18:53:58 acg 4712027Sjungma@eit.uni-kl.de// Andy Goodrich: added $Log command so that CVS comments are reproduced in 4812027Sjungma@eit.uni-kl.de// the source. 4912027Sjungma@eit.uni-kl.de// 5012027Sjungma@eit.uni-kl.de 5112027Sjungma@eit.uni-kl.de#ifndef SCFX_MANT_H 5212027Sjungma@eit.uni-kl.de#define SCFX_MANT_H 5312027Sjungma@eit.uni-kl.de 5412027Sjungma@eit.uni-kl.de 5512027Sjungma@eit.uni-kl.de#include "sysc/datatypes/fx/scfx_ieee.h" 5612027Sjungma@eit.uni-kl.de#include "sysc/datatypes/fx/scfx_utils.h" 5712027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_macros.h" 5812027Sjungma@eit.uni-kl.de 5912027Sjungma@eit.uni-kl.de 6012027Sjungma@eit.uni-kl.denamespace sc_dt 6112027Sjungma@eit.uni-kl.de{ 6212027Sjungma@eit.uni-kl.de 6312027Sjungma@eit.uni-kl.de// classes defined in this module 6412027Sjungma@eit.uni-kl.declass scfx_mant; 6512027Sjungma@eit.uni-kl.declass scfx_mant_ref; 6612027Sjungma@eit.uni-kl.de 6712027Sjungma@eit.uni-kl.de 6812027Sjungma@eit.uni-kl.detypedef unsigned int word; // Using int because of 64-bit machines. 6912027Sjungma@eit.uni-kl.detypedef unsigned short half_word; 7012027Sjungma@eit.uni-kl.de 7112027Sjungma@eit.uni-kl.de 7212027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 7312027Sjungma@eit.uni-kl.de// CLASS : scfx_mant 7412027Sjungma@eit.uni-kl.de// 7512027Sjungma@eit.uni-kl.de// Mantissa class. 7612027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 7712027Sjungma@eit.uni-kl.de 7812027Sjungma@eit.uni-kl.declass scfx_mant 7912027Sjungma@eit.uni-kl.de{ 8012027Sjungma@eit.uni-kl.de 8112027Sjungma@eit.uni-kl.de word* m_array; 8212027Sjungma@eit.uni-kl.de int m_size; 8312027Sjungma@eit.uni-kl.de 8412027Sjungma@eit.uni-kl.depublic: 8512027Sjungma@eit.uni-kl.de 8612027Sjungma@eit.uni-kl.de explicit scfx_mant( std::size_t ); 8712027Sjungma@eit.uni-kl.de scfx_mant( const scfx_mant& ); 8812027Sjungma@eit.uni-kl.de 8912027Sjungma@eit.uni-kl.de scfx_mant& operator = ( const scfx_mant& ); 9012027Sjungma@eit.uni-kl.de 9112027Sjungma@eit.uni-kl.de ~scfx_mant(); 9212027Sjungma@eit.uni-kl.de 9312027Sjungma@eit.uni-kl.de void clear(); 9412027Sjungma@eit.uni-kl.de 9512027Sjungma@eit.uni-kl.de void resize_to( int, int = 0 ); 9612027Sjungma@eit.uni-kl.de 9712027Sjungma@eit.uni-kl.de int size() const; 9812027Sjungma@eit.uni-kl.de 9912027Sjungma@eit.uni-kl.de word operator [] ( int ) const; 10012027Sjungma@eit.uni-kl.de word& operator [] ( int ); 10112027Sjungma@eit.uni-kl.de 10212027Sjungma@eit.uni-kl.de half_word half_at( int ) const; 10312027Sjungma@eit.uni-kl.de half_word& half_at( int ); 10412027Sjungma@eit.uni-kl.de 10512027Sjungma@eit.uni-kl.de half_word* half_addr( int = 0 ) const; 10612027Sjungma@eit.uni-kl.de 10712027Sjungma@eit.uni-kl.deprivate: 10812027Sjungma@eit.uni-kl.de 10912027Sjungma@eit.uni-kl.de static word* alloc( std::size_t ); 11012027Sjungma@eit.uni-kl.de static void free( word*, std::size_t ); 11112027Sjungma@eit.uni-kl.de 11212027Sjungma@eit.uni-kl.de static word* alloc_word( std::size_t size ); 11312027Sjungma@eit.uni-kl.de static void free_word( word* array, std::size_t size ); 11412027Sjungma@eit.uni-kl.de 11512027Sjungma@eit.uni-kl.de}; 11612027Sjungma@eit.uni-kl.de 11712027Sjungma@eit.uni-kl.de 11812027Sjungma@eit.uni-kl.de// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 11912027Sjungma@eit.uni-kl.de 12012027Sjungma@eit.uni-kl.deinline 12112027Sjungma@eit.uni-kl.deint 12212027Sjungma@eit.uni-kl.descfx_mant::size() const 12312027Sjungma@eit.uni-kl.de{ 12412027Sjungma@eit.uni-kl.de return m_size; 12512027Sjungma@eit.uni-kl.de} 12612027Sjungma@eit.uni-kl.de 12712027Sjungma@eit.uni-kl.de 12812027Sjungma@eit.uni-kl.deinline 12912027Sjungma@eit.uni-kl.deword* 13012027Sjungma@eit.uni-kl.descfx_mant::alloc( std::size_t size ) 13112027Sjungma@eit.uni-kl.de{ 13212027Sjungma@eit.uni-kl.de#if defined( SC_BIG_ENDIAN ) 13312027Sjungma@eit.uni-kl.de return alloc_word( size ) + ( size - 1 ); 13412027Sjungma@eit.uni-kl.de#elif defined( SC_LITTLE_ENDIAN ) 13512027Sjungma@eit.uni-kl.de return alloc_word( size ); 13612027Sjungma@eit.uni-kl.de#endif 13712027Sjungma@eit.uni-kl.de} 13812027Sjungma@eit.uni-kl.de 13912027Sjungma@eit.uni-kl.deinline 14012027Sjungma@eit.uni-kl.devoid 14112027Sjungma@eit.uni-kl.descfx_mant::free( word* mant, std::size_t size ) 14212027Sjungma@eit.uni-kl.de{ 14312027Sjungma@eit.uni-kl.de#if defined( SC_BIG_ENDIAN ) 14412027Sjungma@eit.uni-kl.de free_word( mant - ( size - 1 ), size ); 14512027Sjungma@eit.uni-kl.de#elif defined( SC_LITTLE_ENDIAN ) 14612027Sjungma@eit.uni-kl.de free_word( mant, size ); 14712027Sjungma@eit.uni-kl.de#endif 14812027Sjungma@eit.uni-kl.de} 14912027Sjungma@eit.uni-kl.de 15012027Sjungma@eit.uni-kl.deinline 15112027Sjungma@eit.uni-kl.deword 15212027Sjungma@eit.uni-kl.descfx_mant::operator[]( int i ) const 15312027Sjungma@eit.uni-kl.de{ 15412027Sjungma@eit.uni-kl.de SC_ASSERT_( i >= 0 && i < m_size, "mantissa index out of range" ); 15512027Sjungma@eit.uni-kl.de#if defined( SC_BIG_ENDIAN ) 15612027Sjungma@eit.uni-kl.de return m_array[-i]; 15712027Sjungma@eit.uni-kl.de#elif defined( SC_LITTLE_ENDIAN ) 15812027Sjungma@eit.uni-kl.de return m_array[i]; 15912027Sjungma@eit.uni-kl.de#endif 16012027Sjungma@eit.uni-kl.de} 16112027Sjungma@eit.uni-kl.de 16212027Sjungma@eit.uni-kl.deinline 16312027Sjungma@eit.uni-kl.deword& 16412027Sjungma@eit.uni-kl.descfx_mant::operator[]( int i ) 16512027Sjungma@eit.uni-kl.de{ 16612027Sjungma@eit.uni-kl.de SC_ASSERT_( i >= 0 && i < m_size, "mantissa index out of range" ); 16712027Sjungma@eit.uni-kl.de#if defined( SC_BIG_ENDIAN ) 16812027Sjungma@eit.uni-kl.de return m_array[-i]; 16912027Sjungma@eit.uni-kl.de#elif defined( SC_LITTLE_ENDIAN ) 17012027Sjungma@eit.uni-kl.de return m_array[i]; 17112027Sjungma@eit.uni-kl.de#endif 17212027Sjungma@eit.uni-kl.de} 17312027Sjungma@eit.uni-kl.de 17412027Sjungma@eit.uni-kl.deinline 17512027Sjungma@eit.uni-kl.descfx_mant::scfx_mant( std::size_t size ) 17612027Sjungma@eit.uni-kl.de: m_array(0), m_size(size) 17712027Sjungma@eit.uni-kl.de{ 17812027Sjungma@eit.uni-kl.de m_array = alloc( size ); 17912027Sjungma@eit.uni-kl.de} 18012027Sjungma@eit.uni-kl.de 18112027Sjungma@eit.uni-kl.deinline 18212027Sjungma@eit.uni-kl.descfx_mant::scfx_mant( const scfx_mant& rhs ) 18312027Sjungma@eit.uni-kl.de: m_array(0), m_size(rhs.m_size) 18412027Sjungma@eit.uni-kl.de{ 18512027Sjungma@eit.uni-kl.de m_array = alloc( m_size ); 18612027Sjungma@eit.uni-kl.de for( int i = 0; i < m_size; i ++ ) 18712027Sjungma@eit.uni-kl.de { 18812027Sjungma@eit.uni-kl.de (*this)[i] = rhs[i]; 18912027Sjungma@eit.uni-kl.de } 19012027Sjungma@eit.uni-kl.de} 19112027Sjungma@eit.uni-kl.de 19212027Sjungma@eit.uni-kl.deinline 19312027Sjungma@eit.uni-kl.descfx_mant& 19412027Sjungma@eit.uni-kl.descfx_mant::operator = ( const scfx_mant& rhs ) 19512027Sjungma@eit.uni-kl.de{ 19612027Sjungma@eit.uni-kl.de if( &rhs != this ) 19712027Sjungma@eit.uni-kl.de { 19812027Sjungma@eit.uni-kl.de if( m_size != rhs.m_size ) 19912027Sjungma@eit.uni-kl.de { 20012027Sjungma@eit.uni-kl.de free( m_array, m_size ); 20112027Sjungma@eit.uni-kl.de m_array = alloc( m_size = rhs.m_size ); 20212027Sjungma@eit.uni-kl.de } 20312027Sjungma@eit.uni-kl.de 20412027Sjungma@eit.uni-kl.de for( int i = 0; i < m_size; i ++ ) 20512027Sjungma@eit.uni-kl.de { 20612027Sjungma@eit.uni-kl.de (*this)[i] = rhs[i]; 20712027Sjungma@eit.uni-kl.de } 20812027Sjungma@eit.uni-kl.de } 20912027Sjungma@eit.uni-kl.de return *this; 21012027Sjungma@eit.uni-kl.de} 21112027Sjungma@eit.uni-kl.de 21212027Sjungma@eit.uni-kl.deinline 21312027Sjungma@eit.uni-kl.descfx_mant::~scfx_mant() 21412027Sjungma@eit.uni-kl.de{ 21512027Sjungma@eit.uni-kl.de if( m_array != 0 ) 21612027Sjungma@eit.uni-kl.de { 21712027Sjungma@eit.uni-kl.de free( m_array, m_size ); 21812027Sjungma@eit.uni-kl.de } 21912027Sjungma@eit.uni-kl.de} 22012027Sjungma@eit.uni-kl.de 22112027Sjungma@eit.uni-kl.deinline 22212027Sjungma@eit.uni-kl.devoid 22312027Sjungma@eit.uni-kl.descfx_mant::clear() 22412027Sjungma@eit.uni-kl.de{ 22512027Sjungma@eit.uni-kl.de for( int i = 0; i < m_size; i ++ ) 22612027Sjungma@eit.uni-kl.de { 22712027Sjungma@eit.uni-kl.de (*this)[i] = 0; 22812027Sjungma@eit.uni-kl.de } 22912027Sjungma@eit.uni-kl.de} 23012027Sjungma@eit.uni-kl.de 23112027Sjungma@eit.uni-kl.deinline 23212027Sjungma@eit.uni-kl.devoid 23312027Sjungma@eit.uni-kl.descfx_mant::resize_to( int size, int restore ) 23412027Sjungma@eit.uni-kl.de{ 23512027Sjungma@eit.uni-kl.de if( size == m_size ) 23612027Sjungma@eit.uni-kl.de { 23712027Sjungma@eit.uni-kl.de return; 23812027Sjungma@eit.uni-kl.de } 23912027Sjungma@eit.uni-kl.de 24012027Sjungma@eit.uni-kl.de if( ! m_array ) 24112027Sjungma@eit.uni-kl.de { 24212027Sjungma@eit.uni-kl.de m_array = alloc( m_size = size ); 24312027Sjungma@eit.uni-kl.de } 24412027Sjungma@eit.uni-kl.de else 24512027Sjungma@eit.uni-kl.de { 24612027Sjungma@eit.uni-kl.de word* p = alloc( size ); 24712027Sjungma@eit.uni-kl.de 24812027Sjungma@eit.uni-kl.de if( restore ) 24912027Sjungma@eit.uni-kl.de { 25012027Sjungma@eit.uni-kl.de int end = sc_min( size, m_size ); 25112027Sjungma@eit.uni-kl.de if( restore == 1 ) // msb resized -> align at 0 25212027Sjungma@eit.uni-kl.de { 25312027Sjungma@eit.uni-kl.de for( int i = 0; i < size; i ++ ) 25412027Sjungma@eit.uni-kl.de { 25512027Sjungma@eit.uni-kl.de if( i < end ) 25612027Sjungma@eit.uni-kl.de { 25712027Sjungma@eit.uni-kl.de#if defined( SC_BIG_ENDIAN ) 25812027Sjungma@eit.uni-kl.de p[-i] = m_array[-i]; 25912027Sjungma@eit.uni-kl.de#elif defined( SC_LITTLE_ENDIAN ) 26012027Sjungma@eit.uni-kl.de p[i] = m_array[i]; 26112027Sjungma@eit.uni-kl.de#endif 26212027Sjungma@eit.uni-kl.de } 26312027Sjungma@eit.uni-kl.de else 26412027Sjungma@eit.uni-kl.de { 26512027Sjungma@eit.uni-kl.de#if defined( SC_BIG_ENDIAN ) 26612027Sjungma@eit.uni-kl.de p[-i] = 0; 26712027Sjungma@eit.uni-kl.de#elif defined( SC_LITTLE_ENDIAN ) 26812027Sjungma@eit.uni-kl.de p[i] = 0; 26912027Sjungma@eit.uni-kl.de#endif 27012027Sjungma@eit.uni-kl.de } 27112027Sjungma@eit.uni-kl.de } 27212027Sjungma@eit.uni-kl.de } 27312027Sjungma@eit.uni-kl.de else // lsb resized -> align at size-1 27412027Sjungma@eit.uni-kl.de { 27512027Sjungma@eit.uni-kl.de for( int i = 0; i < size; i ++ ) 27612027Sjungma@eit.uni-kl.de { 27712027Sjungma@eit.uni-kl.de if( i < end ) 27812027Sjungma@eit.uni-kl.de { 27912027Sjungma@eit.uni-kl.de#if defined( SC_BIG_ENDIAN ) 28012027Sjungma@eit.uni-kl.de p[-size+1+i] = m_array[-m_size+1+i]; 28112027Sjungma@eit.uni-kl.de#elif defined( SC_LITTLE_ENDIAN ) 28212027Sjungma@eit.uni-kl.de p[size-1-i] = m_array[m_size-1-i]; 28312027Sjungma@eit.uni-kl.de#endif 28412027Sjungma@eit.uni-kl.de } 28512027Sjungma@eit.uni-kl.de else 28612027Sjungma@eit.uni-kl.de { 28712027Sjungma@eit.uni-kl.de#if defined( SC_BIG_ENDIAN ) 28812027Sjungma@eit.uni-kl.de p[-size+1+i] = 0; 28912027Sjungma@eit.uni-kl.de#elif defined( SC_LITTLE_ENDIAN ) 29012027Sjungma@eit.uni-kl.de p[size-1-i] = 0; 29112027Sjungma@eit.uni-kl.de#endif 29212027Sjungma@eit.uni-kl.de } 29312027Sjungma@eit.uni-kl.de } 29412027Sjungma@eit.uni-kl.de } 29512027Sjungma@eit.uni-kl.de } 29612027Sjungma@eit.uni-kl.de 29712027Sjungma@eit.uni-kl.de free( m_array, m_size ); 29812027Sjungma@eit.uni-kl.de m_array = p; 29912027Sjungma@eit.uni-kl.de m_size = size; 30012027Sjungma@eit.uni-kl.de } 30112027Sjungma@eit.uni-kl.de} 30212027Sjungma@eit.uni-kl.de 30312027Sjungma@eit.uni-kl.deinline 30412027Sjungma@eit.uni-kl.dehalf_word 30512027Sjungma@eit.uni-kl.descfx_mant::half_at( int i ) const 30612027Sjungma@eit.uni-kl.de{ 30712027Sjungma@eit.uni-kl.de SC_ASSERT_( ( i >> 1 ) >= 0 && ( i >> 1 ) < m_size, 30812027Sjungma@eit.uni-kl.de "mantissa index out of range" ); 30912027Sjungma@eit.uni-kl.de#if defined( SC_BIG_ENDIAN ) 31012027Sjungma@eit.uni-kl.de return reinterpret_cast<half_word*>( m_array )[-i]; 31112027Sjungma@eit.uni-kl.de#elif defined( SC_LITTLE_ENDIAN ) 31212027Sjungma@eit.uni-kl.de return reinterpret_cast<half_word*>( m_array )[i]; 31312027Sjungma@eit.uni-kl.de#endif 31412027Sjungma@eit.uni-kl.de} 31512027Sjungma@eit.uni-kl.de 31612027Sjungma@eit.uni-kl.deinline 31712027Sjungma@eit.uni-kl.dehalf_word& 31812027Sjungma@eit.uni-kl.descfx_mant::half_at( int i ) 31912027Sjungma@eit.uni-kl.de{ 32012027Sjungma@eit.uni-kl.de SC_ASSERT_( ( i >> 1 ) >= 0 && ( i >> 1 ) < m_size, 32112027Sjungma@eit.uni-kl.de "mantissa index out of range" ); 32212027Sjungma@eit.uni-kl.de#if defined( SC_BIG_ENDIAN ) 32312027Sjungma@eit.uni-kl.de return reinterpret_cast<half_word*>( m_array )[-i]; 32412027Sjungma@eit.uni-kl.de#elif defined( SC_LITTLE_ENDIAN ) 32512027Sjungma@eit.uni-kl.de return reinterpret_cast<half_word*>( m_array )[i]; 32612027Sjungma@eit.uni-kl.de#endif 32712027Sjungma@eit.uni-kl.de} 32812027Sjungma@eit.uni-kl.de 32912027Sjungma@eit.uni-kl.deinline 33012027Sjungma@eit.uni-kl.dehalf_word* 33112027Sjungma@eit.uni-kl.descfx_mant::half_addr( int i ) const 33212027Sjungma@eit.uni-kl.de{ 33312027Sjungma@eit.uni-kl.de SC_ASSERT_( i >= 0 && i < m_size, "mantissa index out of range" ); 33412027Sjungma@eit.uni-kl.de#if defined( SC_BIG_ENDIAN ) 33512027Sjungma@eit.uni-kl.de return reinterpret_cast<half_word*>( m_array - i ) + 1; 33612027Sjungma@eit.uni-kl.de#elif defined( SC_LITTLE_ENDIAN ) 33712027Sjungma@eit.uni-kl.de return reinterpret_cast<half_word*>( m_array + i ); 33812027Sjungma@eit.uni-kl.de#endif 33912027Sjungma@eit.uni-kl.de} 34012027Sjungma@eit.uni-kl.de 34112027Sjungma@eit.uni-kl.de 34212027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 34312027Sjungma@eit.uni-kl.de// one's complement of a mantissa 34412027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 34512027Sjungma@eit.uni-kl.de 34612027Sjungma@eit.uni-kl.deinline 34712027Sjungma@eit.uni-kl.devoid 34812027Sjungma@eit.uni-kl.decomplement( scfx_mant& target, const scfx_mant& source, int size ) 34912027Sjungma@eit.uni-kl.de{ 35012027Sjungma@eit.uni-kl.de for( int i = 0; i < size; i ++ ) 35112027Sjungma@eit.uni-kl.de { 35212027Sjungma@eit.uni-kl.de target[i] = ~source[i]; 35312027Sjungma@eit.uni-kl.de } 35412027Sjungma@eit.uni-kl.de} 35512027Sjungma@eit.uni-kl.de 35612027Sjungma@eit.uni-kl.de 35712027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 35812027Sjungma@eit.uni-kl.de// increment mantissa 35912027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 36012027Sjungma@eit.uni-kl.de 36112027Sjungma@eit.uni-kl.deinline 36212027Sjungma@eit.uni-kl.devoid 36312027Sjungma@eit.uni-kl.deinc( scfx_mant& mant ) 36412027Sjungma@eit.uni-kl.de{ 36512027Sjungma@eit.uni-kl.de for( int i = 0; i < mant.size(); i ++ ) 36612027Sjungma@eit.uni-kl.de { 36712027Sjungma@eit.uni-kl.de if( ++ mant[i] ) 36812027Sjungma@eit.uni-kl.de { 36912027Sjungma@eit.uni-kl.de break; 37012027Sjungma@eit.uni-kl.de } 37112027Sjungma@eit.uni-kl.de } 37212027Sjungma@eit.uni-kl.de} 37312027Sjungma@eit.uni-kl.de 37412027Sjungma@eit.uni-kl.de 37512027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 37612027Sjungma@eit.uni-kl.de// CLASS : scfx_mant_ref 37712027Sjungma@eit.uni-kl.de// 37812027Sjungma@eit.uni-kl.de// Mantissa reference class. 37912027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 38012027Sjungma@eit.uni-kl.de 38112027Sjungma@eit.uni-kl.declass scfx_mant_ref 38212027Sjungma@eit.uni-kl.de{ 38312027Sjungma@eit.uni-kl.de 38412027Sjungma@eit.uni-kl.de scfx_mant* m_mant; 38512027Sjungma@eit.uni-kl.de bool m_not_const; 38612027Sjungma@eit.uni-kl.de 38712027Sjungma@eit.uni-kl.depublic: 38812027Sjungma@eit.uni-kl.de 38912027Sjungma@eit.uni-kl.de scfx_mant_ref(); 39012027Sjungma@eit.uni-kl.de scfx_mant_ref( const scfx_mant& ); 39112027Sjungma@eit.uni-kl.de scfx_mant_ref( scfx_mant* ); 39212027Sjungma@eit.uni-kl.de 39312027Sjungma@eit.uni-kl.de scfx_mant_ref& operator = ( const scfx_mant& ); 39412027Sjungma@eit.uni-kl.de scfx_mant_ref& operator = ( scfx_mant* ); 39512027Sjungma@eit.uni-kl.de 39612027Sjungma@eit.uni-kl.de ~scfx_mant_ref(); 39712027Sjungma@eit.uni-kl.de 39812027Sjungma@eit.uni-kl.de operator scfx_mant&(); 39912027Sjungma@eit.uni-kl.de 40012027Sjungma@eit.uni-kl.de word operator [] ( int ); 40112027Sjungma@eit.uni-kl.de 40212027Sjungma@eit.uni-kl.deprivate: 40312027Sjungma@eit.uni-kl.de 40412027Sjungma@eit.uni-kl.de void remove_it(); 40512027Sjungma@eit.uni-kl.de 40612027Sjungma@eit.uni-kl.de scfx_mant_ref( const scfx_mant_ref& ); 40712027Sjungma@eit.uni-kl.de scfx_mant_ref& operator = ( const scfx_mant_ref& ); 40812027Sjungma@eit.uni-kl.de 40912027Sjungma@eit.uni-kl.de void* operator new( std::size_t sz ) { return ::operator new( sz ); } 41012027Sjungma@eit.uni-kl.de 41112027Sjungma@eit.uni-kl.de}; 41212027Sjungma@eit.uni-kl.de 41312027Sjungma@eit.uni-kl.de 41412027Sjungma@eit.uni-kl.de// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 41512027Sjungma@eit.uni-kl.de 41612027Sjungma@eit.uni-kl.deinline 41712027Sjungma@eit.uni-kl.devoid 41812027Sjungma@eit.uni-kl.descfx_mant_ref::remove_it() 41912027Sjungma@eit.uni-kl.de{ 42012027Sjungma@eit.uni-kl.de if( m_not_const ) 42112027Sjungma@eit.uni-kl.de { 42212027Sjungma@eit.uni-kl.de delete m_mant; 42312027Sjungma@eit.uni-kl.de } 42412027Sjungma@eit.uni-kl.de} 42512027Sjungma@eit.uni-kl.de 42612027Sjungma@eit.uni-kl.deinline 42712027Sjungma@eit.uni-kl.descfx_mant_ref::scfx_mant_ref() 42812027Sjungma@eit.uni-kl.de: m_mant( 0 ), m_not_const( false ) 42912027Sjungma@eit.uni-kl.de{} 43012027Sjungma@eit.uni-kl.de 43112027Sjungma@eit.uni-kl.deinline 43212027Sjungma@eit.uni-kl.descfx_mant_ref::scfx_mant_ref( const scfx_mant& mant ) 43312027Sjungma@eit.uni-kl.de: m_mant( const_cast<scfx_mant*>( &mant ) ), m_not_const( false ) 43412027Sjungma@eit.uni-kl.de{} 43512027Sjungma@eit.uni-kl.de 43612027Sjungma@eit.uni-kl.deinline 43712027Sjungma@eit.uni-kl.descfx_mant_ref::scfx_mant_ref( scfx_mant* mant ) 43812027Sjungma@eit.uni-kl.de: m_mant( mant ), m_not_const( true ) 43912027Sjungma@eit.uni-kl.de{} 44012027Sjungma@eit.uni-kl.de 44112027Sjungma@eit.uni-kl.deinline 44212027Sjungma@eit.uni-kl.descfx_mant_ref& 44312027Sjungma@eit.uni-kl.descfx_mant_ref::operator = ( const scfx_mant& mant ) 44412027Sjungma@eit.uni-kl.de{ 44512027Sjungma@eit.uni-kl.de remove_it(); 44612027Sjungma@eit.uni-kl.de 44712027Sjungma@eit.uni-kl.de m_mant = const_cast<scfx_mant*>( &mant ); 44812027Sjungma@eit.uni-kl.de m_not_const = false; 44912027Sjungma@eit.uni-kl.de 45012027Sjungma@eit.uni-kl.de return *this; 45112027Sjungma@eit.uni-kl.de} 45212027Sjungma@eit.uni-kl.de 45312027Sjungma@eit.uni-kl.deinline 45412027Sjungma@eit.uni-kl.descfx_mant_ref& 45512027Sjungma@eit.uni-kl.descfx_mant_ref::operator = ( scfx_mant* mant ) 45612027Sjungma@eit.uni-kl.de{ 45712027Sjungma@eit.uni-kl.de remove_it(); 45812027Sjungma@eit.uni-kl.de 45912027Sjungma@eit.uni-kl.de m_mant = mant; 46012027Sjungma@eit.uni-kl.de m_not_const = true; 46112027Sjungma@eit.uni-kl.de 46212027Sjungma@eit.uni-kl.de return *this; 46312027Sjungma@eit.uni-kl.de} 46412027Sjungma@eit.uni-kl.de 46512027Sjungma@eit.uni-kl.deinline 46612027Sjungma@eit.uni-kl.descfx_mant_ref::~scfx_mant_ref() 46712027Sjungma@eit.uni-kl.de{ 46812027Sjungma@eit.uni-kl.de remove_it(); 46912027Sjungma@eit.uni-kl.de} 47012027Sjungma@eit.uni-kl.de 47112027Sjungma@eit.uni-kl.deinline 47212027Sjungma@eit.uni-kl.descfx_mant_ref::operator scfx_mant&() 47312027Sjungma@eit.uni-kl.de{ 47412027Sjungma@eit.uni-kl.de // SC_ASSERT_( m_not_const, "not allowed to modify mant" ); 47512027Sjungma@eit.uni-kl.de return *m_mant; 47612027Sjungma@eit.uni-kl.de} 47712027Sjungma@eit.uni-kl.de 47812027Sjungma@eit.uni-kl.deinline 47912027Sjungma@eit.uni-kl.deword 48012027Sjungma@eit.uni-kl.descfx_mant_ref::operator [] ( int i ) 48112027Sjungma@eit.uni-kl.de{ 48212027Sjungma@eit.uni-kl.de return (*m_mant)[i]; 48312027Sjungma@eit.uni-kl.de} 48412027Sjungma@eit.uni-kl.de 48512027Sjungma@eit.uni-kl.de} // namespace sc_dt 48612027Sjungma@eit.uni-kl.de 48712027Sjungma@eit.uni-kl.de 48812027Sjungma@eit.uni-kl.de#endif 48912027Sjungma@eit.uni-kl.de 49012027Sjungma@eit.uni-kl.de// Taf! 491