#include"CLib.h"
#include<iostream>
#include<string>
#include<cassert>
#include<fstream>
using namespace std;
int main() {
CStash intStash, stringStash;
int i;
char* cp;
ifstream in;
string line;
const int bufsize = 80;
initialize(&intStash, sizeof(int));
for ( i = 0; i < 100; i++)
{
add(&intStash, &i);
}
for (i = 0; i < count(&intStash); i++)
{
cout << "fetch(&intStash," << i << ") = "
<< *(int*)fetch(&intStash, i)
<< endl;
}
cleanup(&intStash);
system("pause");
}
#ifndef CLIB_H
#define CLIB_H
typedef struct CStashTag {
int size;
int quantity;
int next;
unsigned char* storage;
}CStash;
void initialize(CStash* s, int size);
void cleanup(CStash *s);
int add(CStash *s, const void* element);
void* fetch(CStash*s, int index); //取
int count(CStash* s);
void inflate(CStash* s, int increate);//增加
#endif // !CLIB_H
#include "CLib.h"
#include<iostream>
#include<cassert>
using namespace std;
const int increment = 100;
void initialize(CStash * s, int size)
{
s->size = size;
s->quantity = 0;
s->storage = 0;
s->next = 0;
}
void cleanup(CStash * s)
{
if (s->storage != 0)
cout << "free" << endl;
delete[] s->storage;
}
int add(CStash * s, const void * element)
{
if(s->next>=s->quantity)
inflate(s,increment );
int startBytes = s->next* s->size;
unsigned char *e = (unsigned char *)element;
for (int i = 0; i < s->size; i++)
s->storage[startBytes + i] = e[i];
s->next++;
return (s->next - 1);
}
void * fetch(CStash * s, int index)
{
assert(0 <= index);
if (index >= s->next)
return 0;
return &(s->storage[index*s->size]);
}
int count(CStash * s)
{
return s->next;
}
void inflate(CStash * s, int increate)
{
assert(increate > 0);
int newQuantity = s->quantity + increment;
int newBytes = newQuantity * s->size;
int oldBytes = s->quantity*s->size;
unsigned char *b = new unsigned char[newBytes];
for (int i = 0; i < oldBytes; i++)
{
b[i] = s->storage[i];
}
delete[](s->storage);
s->storage = b;
s->quantity = newQuantity;
}
class Stash {
struct Link {
void *data;
Link* next;
void init(void* dat, Link* nxt);
}*head;
public:
void init();
void push(void *dat, Link* nxt);
void *peek();
void* pop();
void cleanup();
};