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