3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-08 18:31:49 +00:00
z3/test/stack.cpp
Leonardo de Moura 68269c43a6 other components
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
2012-10-02 11:48:48 -07:00

76 lines
1.6 KiB
C++

/*++
Copyright (c) 2007 Microsoft Corporation
Module Name:
stack.cpp
Abstract:
Low level stack (aka stack-based allocator).
Author:
Leonardo (leonardo) 2011-02-27
Notes:
--*/
#include<utility>
#include"stack.h"
#include"vector.h"
typedef std::pair<unsigned, unsigned> point;
static void tst1() {
stack s;
point * p1 = new (s) point(10, 20);
point * p2 = new (s) point(30, 40);
void * ptr = s.allocate(16000);
SASSERT(p2->first == 30 && p2->second == 40);
SASSERT(p1->first == 10 && p1->second == 20);
s.deallocate(static_cast<int*>(ptr));
s.deallocate(p2);
s.deallocate(p1);
}
static void tst2(unsigned num, unsigned del_rate) {
ptr_vector<char> ptrs;
stack s;
for (unsigned i = 0; i < num; i++) {
SASSERT(ptrs.empty() == s.empty());
SASSERT(s.empty() || ptrs.back() == s.top());
if (!ptrs.empty() && rand() % del_rate == 0) {
s.deallocate();
ptrs.pop_back();
}
else {
unsigned size;
if (rand()%10 == 0) {
size = 8192 + rand()%800;
}
else {
size = rand()%100;
}
char * ptr = static_cast<char*>(s.allocate(size));
ptrs.push_back(ptr);
}
}
while (s.empty()) {
SASSERT(ptrs.empty() == s.empty());
SASSERT(s.empty() || ptrs.back() == s.top());
s.deallocate();
ptrs.pop_back();
}
}
void tst_stack() {
tst1();
tst2(1000, 10);
tst2(2000, 2);
tst2(100000, 10);
tst2(300000, 5);
tst2(300000, 2);
tst2(300000, 7);
}