/*****************************************************************************

  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
  more contributor license agreements.  See the NOTICE file distributed
  with this work for additional information regarding copyright ownership.
  Accellera licenses this file to you under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with the
  License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
  implied.  See the License for the specific language governing
  permissions and limitations under the License.

 *****************************************************************************/

/*****************************************************************************

  sc_temporary.h -- Temporary value pool classes.

  Original Author: Andy Goodrich, Forte Design Systems, Inc.

  CHANGE LOG AT END OF FILE
 *****************************************************************************/

#ifndef __SYSTEMC_EXT_DT_SC_TEMPORARY_HH__
#define __SYSTEMC_EXT_DT_SC_TEMPORARY_HH__

#include <cstddef> // std::size_t

namespace sc_core
{

//-----------------------------------------------------------------------------
// sc_byte_heap - CLASS MANAGING A TEMPORARY HEAP OF BYTES
//
// This facility implements a heap of temporary byte allocations. Once an
// request has been allocated it is not freed. However the entire heap
// wraps and the storage is reused. This means that no allocations should
// be assumed as permanent. Allocations are double-word aligned. This is
// raw storage, so objects which contain virtual methods cannot be allocated
// with this object. See the sc_vpool object for that type of storage
// allocation.
//
// char* allocate( int size )
//   This method returns a pointer to block of size bytes. The block
//   returned is the next available one in the heap. If the current heap
//   cannot fullfil the request it will be rewound and storage allocated from
//   its start. All allocations start on an 8-byte boundary.
//       size = number of bytes to be allocated.
//
// void initialize( int heap_size=0x100000 )
//   This method allocates the storage to be managed. If there is already
//   a block of storage under management it is freed. If no argument is
//   provided for the heap size, a megabyte will be allocated.
//       heap_size = number of bytes to allocate for the heap.
//
// unsigned int length()
//   This method returns the size of this object's heap in bytes.
//
// sc_byte_heap()
//   This is the non-initialized object instance constructor. It does not
//   allocate the heap storage, that is done by the initialize() method.
//
// sc_byte_heap(int)
//   This is the initializing object instance constructor. It does allocates
//   a heap of the specified number of bytes.
//       heap_size = number of bytes to allocate for the heap.
//-----------------------------------------------------------------------------
class sc_byte_heap
{
  public:
    char *m_bgn_p; // Beginning of heap storage.
    char *m_end_p; // End of heap storage.
    char *m_next_p; // Next heap location to be allocated.

    inline char *
    allocate(std::size_t bytes_n)
    {
        char *result_p;
        bytes_n = (bytes_n + 7) & ((std::size_t)(-8));
        result_p = m_next_p;
        m_next_p += bytes_n;
        if (m_next_p >= m_end_p) {
            result_p = m_bgn_p;
            m_next_p = m_bgn_p + bytes_n;
        }
        return result_p;
    }

    inline void
    initialize(std::size_t heap_size=0x100000)
    {
        delete [] m_bgn_p;
        m_bgn_p = new char[heap_size];
        m_end_p = &m_bgn_p[heap_size];
        m_next_p = m_bgn_p;
    }

    inline std::size_t
    length()
    {
        return (std::size_t)(m_end_p - m_bgn_p);
    }

    inline sc_byte_heap() : m_bgn_p(0), m_end_p(0), m_next_p(0) {}

    inline sc_byte_heap(std::size_t heap_size) :
            m_bgn_p(0), m_end_p(0), m_next_p(0)
    {
        initialize(heap_size);
    }

    inline ~sc_byte_heap() { delete [] m_bgn_p;	}
};


//-----------------------------------------------------------------------------
// sc_vpool<T> - CLASS MANAGING A TEMPORARY VECTOR OF CLASS T INSTANCES
//
// This class implements a fixed pool of objects contained in a vector. These
// objects are allocated via the allocate() method. An index, m_pool_i,
// indicates the next object to be allocated. The vector is a power of 2 in
// size, and this fact is used to wrap the list when m_pool_i reaches the
// end of the vector.
//
// sc_vpool( int log2, T* pool_p=0 )
//   This is the object instance constructor for this class. It configures
//   the object to manage a vector of 2**log2 entries. If a vector is
//   not supplied one will be allocated.
//     log2   =  the log base two of the size of the vector.
//     pool_p -> vector of 2**log2 entries to be managed or 0.
//
// ~sc_vpool()
//   This is the object instance destructor for this class. It frees the
//   block of storage which was being managed.
//
// T* allocate()
//   This method returns the address of the next entry in the vector, m_pool_p,
//   pointed to by the index, m_pool_i, and updates that index. The index
//   update consists of adding 1 to m_pool_i and masking it by m_wrap.
//
// void reset()
//   This method resets the allocation index, m_pool_i, to point to the start
//   of the vector of objects under management. This call is not usually made
//   since there are a fixed number of entries and the index wraps. However,
//   for diagnostics tests it is convenient to be able to reset to the start
//   of the vector.
//
// int size()
//   This method returns the number of object instances contained in the
//   vector being managed by this object instance.
//-----------------------------------------------------------------------------
template<class T>
class sc_vpool
{
  protected:
    std::size_t m_pool_i; // Index of next entry to m_pool_m to provide.
    T *m_pool_p; // Vector of temporaries.
    std::size_t m_wrap; // Mask to wrap vector index.

  public:
    inline sc_vpool(int log2, T *pool_p=0);
    inline ~sc_vpool();
    inline T *allocate();
    inline void reset();
    inline std::size_t size();
};

template<class T>
sc_vpool<T>::sc_vpool(int log2, T *pool_p) : m_pool_i(0),
        m_pool_p(pool_p ? pool_p : new T[static_cast<std::size_t>(1) << log2]),
        m_wrap(~(static_cast<std::size_t>(-1) << log2))
{
    // if (log2 > 32) SC_REPORT_ERROR(SC_ID_POOL_SIZE_, "");
}

template<class T>
sc_vpool<T>::~sc_vpool()
{
    // delete [] m_pool_p;
}

template<class T>
T *sc_vpool<T>::allocate()
{
    T *result_p; // Entry to return.

    result_p = &m_pool_p[m_pool_i];
    m_pool_i = (m_pool_i + 1) & m_wrap;
    return result_p;
}

template<class T>
void sc_vpool<T>::reset()
{
    m_pool_i = 0;
}

template<class T>
std::size_t sc_vpool<T>::size() { return m_wrap + 1; }

} // namespace sc_core

// $Log: sc_temporary.h,v $
// Revision 1.4  2011/08/26 20:46:19  acg
//  Andy Goodrich: moved the modification log to the end of the file to
//  eliminate source line number skew when check-ins are done.
//
// Revision 1.3  2011/08/24 22:05:56  acg
//  Torsten Maehne: initialization changes to remove warnings.
//
// Revision 1.2  2011/02/18 20:38:44  acg
//  Andy Goodrich: Updated Copyright notice.
//
// Revision 1.1.1.1  2006/12/15 20:20:06  acg
// SystemC 2.3
//
// Revision 1.3  2006/01/13 18:53:11  acg
// Andy Goodrich: Added $Log command so that CVS comments are reproduced in
// the source.
//

#endif // __SYSTEMC_EXT_DT_SC_TEMPORARY_HH__
