11#include " src/include/arena.hpp"
2-
32#include < stdexcept>
43
54/* *
65 * if p_overwrite = true (default) Arena overwrite spaces alocated
76 *
87 * */
9- Arena::Arena ( unsigned int p_size, bool p_overwrite ) : m_size ( p_size ),
10- m_amount ( m_size ),
11- m_overwrite ( p_overwrite )
8+ Arena::Arena (unsigned int p_size, unsigned int p_limit, bool p_overwrite) : m_size(p_size),
9+ m_amount(m_size),
10+ m_limit(p_limit),
11+ m_overwrite(p_overwrite)
1212{
1313 m_mem = new char [m_size];
14- m_ptr = m_mem;
14+ m_head = m_mem;
15+ }
16+
17+ Arena::Arena () : m_mem(nullptr ),
18+ m_size(0 ),
19+ m_amount(0 ),
20+ m_limit(0 ),
21+ m_head(nullptr ),
22+ m_overwrite(0 )
23+ {
1524}
1625
1726/*
1827 * avoid copy arena, greater than the heap, but it loses performance
1928 * */
20- Arena Arena::operator = ( const Arena &fast )
29+ Arena Arena::operator =( const Arena &fast)
2130{
22- delete [] m_mem;
31+ delete[] m_mem;
2332
2433 m_mem = new char [fast.m_size ];
25- memcpy ( m_mem, fast.m_mem , fast.m_size );
34+ memcpy ( m_mem, fast.m_mem , fast.m_size );
2635 m_size = fast.m_size ;
27- m_ptr = fast.m_ptr ;
36+ m_head = fast.m_head ;
2837 m_amount = fast.m_amount ;
2938 m_overwrite = fast.m_overwrite ;
39+ m_limit = m_amount;
40+
3041 return *this ;
3142}
3243
33-
3444/*
3545 * avoid copy arena, greater than the heap, but it loses performance
36- */
37- Arena::Arena ( const Arena &fast )
46+ */
47+ Arena::Arena ( const Arena &fast)
3848{
39- delete [] m_mem;
40-
4149 m_mem = new char [fast.m_size ];
42- memcpy ( m_mem, fast.m_mem , fast.m_size );
50+ memcpy ( m_mem, fast.m_mem , fast.m_size );
4351 m_size = fast.m_size ;
44- m_ptr = fast.m_ptr ;
52+ m_head = fast.m_head ;
4553 m_amount = fast.m_amount ;
4654 m_overwrite = fast.m_overwrite ;
55+ m_limit = m_amount;
4756}
4857
4958Arena::~Arena ()
5059{
51- delete [] m_mem;
52- m_ptr = m_mem;
60+ delete[] m_mem;
5361 m_mem = nullptr ;
62+ m_head = m_mem;
5463}
5564
5665/*
5766 * requestes block in arena passing desired size
5867 * */
59- void *Arena::req ( unsigned int p_amount )
68+ void *Arena::req ( unsigned int p_amount)
6069{
61- char *block = nullptr ;
62-
63- if ( p_amount <= m_amount )
70+ if (p_amount <= m_amount)
6471 {
65- block = ( char * ) m_ptr;
66- m_ptr += p_amount;
67- m_amount -= p_amount;
72+ if (p_amount < m_limit && m_overwrite && m_size > m_limit)
73+ {
74+ realloc (m_limit);
75+ goto new_block;
76+ }
77+ else
78+ goto new_block;
6879 }
69- else if ( p_amount > m_size )
80+ else if (p_amount > m_size)
7081 {
71- dell ();
72- mmem ( p_amount );
73- block = ( char * ) m_ptr;
74- m_ptr += p_amount;
75- m_amount -= p_amount;
82+ realloc (p_amount);
83+ goto new_block;
7684 }
7785 else
7886 {
79- if ( m_overwrite )
87+ if (m_overwrite)
8088 {
8189 dell ();
82- block = ( char * ) m_ptr;
83- m_ptr += p_amount;
84- m_amount -= p_amount;
85-
90+ goto new_block;
8691 }
8792 else
88- throw std::runtime_error ( " Arena full" );
93+ throw std::runtime_error ( " Arena : Arena is full" );
8994 }
9095
96+ new_block:
97+ char *block = const_cast <char *>(m_head);
98+ m_head += p_amount;
99+ m_amount -= p_amount;
100+
91101 return block;
92102}
93103
94- /* (m_ptr )
104+ /* (m_head )
95105 * ↓
96106 * (m_mem) -> [ ][ ][ ][ ] ...
97- *
107+ * return pointer head for initial memory
98108 * */
99109void Arena::dell ()
100110{
101- m_ptr = m_mem;
111+ m_head = m_mem;
102112 m_amount = m_size;
103113}
104114
115+ /*
116+ * Delete memory
117+ * */
118+ void Arena::erase ()
119+ {
120+ delete[] m_mem;
121+ m_mem = nullptr ;
122+ m_head = m_mem;
123+ m_size = 0 ;
124+ m_amount = m_size;
125+ m_overwrite = true ;
126+ }
127+
105128/*
106129 * return amount free space in arena
107130 * */
108- unsigned int Arena::afree ()
131+ unsigned int Arena::fquantity ()
109132{
110133 return m_amount;
111134}
112135
113136/*
114- * ... [ ][ ][ ] <- [del ] - [alocate] -> [ ][ ][ ][ ] +++
137+ * ... [ ][ ][ ] <- [delete ] - [alocate more ] -> [ ][ ][ ][ ] +++
115138 * */
116- void Arena::mmem ( unsigned int p_amount )
139+ void Arena::realloc ( unsigned int p_amount)
117140{
118- if ( m_mem == nullptr )
141+ if (m_mem != nullptr )
142+ delete[] m_mem;
143+ else if (p_amount == 0 || p_amount == m_size)
119144 return ;
120145
121- delete [] m_mem;
122146 m_mem = new char [p_amount];
123- m_ptr = m_mem;
147+ m_head = m_mem;
124148 m_size = p_amount;
125149 m_amount = m_size;
126- }
150+ }
0 commit comments