mirror of
https://github.com/louisrubet/rpn
synced 2025-01-30 20:34:30 +01:00
#34: stack refactoring
This commit is contained in:
parent
df3042325a
commit
4d394e845e
2 changed files with 38 additions and 53 deletions
|
@ -1,13 +1,17 @@
|
||||||
|
stack _stack_manip;
|
||||||
|
|
||||||
//
|
//
|
||||||
void swap(void)
|
void swap(void)
|
||||||
{
|
{
|
||||||
MIN_ARGUMENTS(2);
|
MIN_ARGUMENTS(2);
|
||||||
_stack->copy_obj_to_local(0, 0);
|
|
||||||
_stack->copy_obj_to_local(1, 1);
|
stack::copy_and_push_back(*_stack, _stack->size()-1, _stack_manip);
|
||||||
|
stack::copy_and_push_back(*_stack, _stack->size()-2, _stack_manip);
|
||||||
(void)_stack->pop_back();
|
(void)_stack->pop_back();
|
||||||
(void)_stack->pop_back();
|
(void)_stack->pop_back();
|
||||||
_stack->push_obj_from_local(0);
|
stack::copy_and_push_back(_stack_manip, 0, *_stack);
|
||||||
_stack->push_obj_from_local(1);
|
stack::copy_and_push_back(_stack_manip, 1, *_stack);
|
||||||
|
_stack_manip.erase();
|
||||||
}
|
}
|
||||||
|
|
||||||
void drop(void)
|
void drop(void)
|
||||||
|
@ -32,17 +36,14 @@ void erase(void)
|
||||||
void dup(void)
|
void dup(void)
|
||||||
{
|
{
|
||||||
MIN_ARGUMENTS(1);
|
MIN_ARGUMENTS(1);
|
||||||
_stack->copy_obj_to_local(0, 0);
|
stack::copy_and_push_back(*_stack, _stack->size()-1, *_stack);
|
||||||
_stack->push_obj_from_local(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void dup2(void)
|
void dup2(void)
|
||||||
{
|
{
|
||||||
MIN_ARGUMENTS(2);
|
MIN_ARGUMENTS(2);
|
||||||
_stack->copy_obj_to_local(0, 0);
|
stack::copy_and_push_back(*_stack, _stack->size()-2, *_stack);
|
||||||
_stack->copy_obj_to_local(1, 1);
|
stack::copy_and_push_back(*_stack, _stack->size()-2, *_stack);
|
||||||
_stack->push_obj_from_local(1);
|
|
||||||
_stack->push_obj_from_local(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void pick(void)
|
void pick(void)
|
||||||
|
@ -55,25 +56,28 @@ void pick(void)
|
||||||
// treat stack depth errors
|
// treat stack depth errors
|
||||||
if ((to_pick == 0) || (to_pick > _stack->size()))
|
if ((to_pick == 0) || (to_pick > _stack->size()))
|
||||||
{
|
{
|
||||||
ERR_CONTEXT(ret_missing_operand);
|
ERR_CONTEXT(ret_out_of_range);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_stack->copy_obj_to_local(to_pick - 1, 0);
|
|
||||||
_stack->push_obj_from_local(0);
|
stack::copy_and_push_back(*_stack, _stack->size()-to_pick, *_stack);
|
||||||
}
|
}
|
||||||
|
|
||||||
void rot(void)
|
void rot(void)
|
||||||
{
|
{
|
||||||
MIN_ARGUMENTS(3);
|
MIN_ARGUMENTS(3);
|
||||||
_stack->copy_obj_to_local(0, 0);
|
|
||||||
_stack->copy_obj_to_local(1, 1);
|
//TODO could be optimized
|
||||||
_stack->copy_obj_to_local(2, 2);
|
stack::copy_and_push_back(*_stack, _stack->size()-3, _stack_manip);
|
||||||
|
stack::copy_and_push_back(*_stack, _stack->size()-2, _stack_manip);
|
||||||
|
stack::copy_and_push_back(*_stack, _stack->size()-1, _stack_manip);
|
||||||
(void)_stack->pop_back();
|
(void)_stack->pop_back();
|
||||||
(void)_stack->pop_back();
|
(void)_stack->pop_back();
|
||||||
(void)_stack->pop_back();
|
(void)_stack->pop_back();
|
||||||
_stack->push_obj_from_local(1);
|
stack::copy_and_push_back(_stack_manip, 2, *_stack);
|
||||||
_stack->push_obj_from_local(0);
|
stack::copy_and_push_back(_stack_manip, 1, *_stack);
|
||||||
_stack->push_obj_from_local(2);
|
stack::copy_and_push_back(_stack_manip, 0, *_stack);
|
||||||
|
_stack_manip.erase();
|
||||||
}
|
}
|
||||||
|
|
||||||
void depth(void)
|
void depth(void)
|
||||||
|
|
45
src/stack.h
45
src/stack.h
|
@ -13,20 +13,10 @@ using namespace std;
|
||||||
// allocation base size
|
// allocation base size
|
||||||
#define ALLOC_STACK_CHUNK (64*1024)
|
#define ALLOC_STACK_CHUNK (64*1024)
|
||||||
#define ALLOC_BLOB_CHUNK (64*1024)
|
#define ALLOC_BLOB_CHUNK (64*1024)
|
||||||
#define LOCAL_COPY_PLACES 3
|
|
||||||
#define LOCAL_COPY_SIZE 128
|
|
||||||
|
|
||||||
//
|
//
|
||||||
class stack
|
class stack
|
||||||
{
|
{
|
||||||
private:
|
|
||||||
struct local_copy
|
|
||||||
{
|
|
||||||
unsigned int length;
|
|
||||||
int type;
|
|
||||||
int blob;
|
|
||||||
};
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
stack()
|
stack()
|
||||||
{
|
{
|
||||||
|
@ -34,9 +24,7 @@ public:
|
||||||
_blob = new char[ALLOC_BLOB_CHUNK];
|
_blob = new char[ALLOC_BLOB_CHUNK];
|
||||||
_total_size = ALLOC_STACK_CHUNK;
|
_total_size = ALLOC_STACK_CHUNK;
|
||||||
_total_blob_size = ALLOC_BLOB_CHUNK;
|
_total_blob_size = ALLOC_BLOB_CHUNK;
|
||||||
_current = _base;
|
erase();
|
||||||
_current_blob = _blob;
|
|
||||||
_count = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ~stack()
|
virtual ~stack()
|
||||||
|
@ -45,6 +33,18 @@ public:
|
||||||
delete[] _blob;
|
delete[] _blob;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void erase()
|
||||||
|
{
|
||||||
|
_current = _base;
|
||||||
|
_current_blob = _blob;
|
||||||
|
_vpointer.clear();
|
||||||
|
_vpointer_blob.clear();
|
||||||
|
_vlen.clear();
|
||||||
|
_vlen_blob.clear();
|
||||||
|
_vtype.clear();
|
||||||
|
_count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
void push_back(void* obj, unsigned int size, int type = 0, bool dont_copy = false, void* blob = NULL, unsigned int blob_size = 0)
|
void push_back(void* obj, unsigned int size, int type = 0, bool dont_copy = false, void* blob = NULL, unsigned int blob_size = 0)
|
||||||
{
|
{
|
||||||
void* allocated_blob;
|
void* allocated_blob;
|
||||||
|
@ -222,23 +222,6 @@ public:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// local objects copy
|
|
||||||
void copy_obj_to_local(unsigned int index, unsigned int to_place)
|
|
||||||
{
|
|
||||||
assert(to_place < LOCAL_COPY_PLACES);
|
|
||||||
struct local_copy* local = (struct local_copy*)_places[to_place];
|
|
||||||
local->length = get_len(index);
|
|
||||||
local->type= get_type(index);
|
|
||||||
memcpy(&local->blob, get_obj(index), local->length);
|
|
||||||
}
|
|
||||||
|
|
||||||
void push_obj_from_local(unsigned int from_place)
|
|
||||||
{
|
|
||||||
assert(from_place < LOCAL_COPY_PLACES);
|
|
||||||
struct local_copy* local = (struct local_copy*)_places[from_place];
|
|
||||||
push_back(&local->blob, local->length, local->type);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
char* _base;
|
char* _base;
|
||||||
char* _blob;
|
char* _blob;
|
||||||
|
@ -253,8 +236,6 @@ private:
|
||||||
unsigned int _count;// =_vlen.size()=_vpointer.size()=_vtype.size()
|
unsigned int _count;// =_vlen.size()=_vpointer.size()=_vtype.size()
|
||||||
unsigned int _total_size;//total allocated size in bytes
|
unsigned int _total_size;//total allocated size in bytes
|
||||||
unsigned int _total_blob_size;//total allocated blob size in bytes
|
unsigned int _total_blob_size;//total allocated blob size in bytes
|
||||||
|
|
||||||
char _places[LOCAL_COPY_PLACES][LOCAL_COPY_SIZE];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
Loading…
Add table
Reference in a new issue