Minor tweaks and a new deque operator
This commit is contained in:
@@ -619,7 +619,7 @@ LuaDefine(unittests_animqueue, "c") {
|
|||||||
|
|
||||||
// Apply the diffs, 4 extra bytes should remain.
|
// Apply the diffs, 4 extra bytes should remain.
|
||||||
aqds.apply_patch(&sb);
|
aqds.apply_patch(&sb);
|
||||||
LuaAssert(L, sb.write_count() - sb.read_count() == 4);
|
LuaAssert(L, sb.total_writes() - sb.total_reads() == 4);
|
||||||
LuaAssert(L, aqds.size_and_steps_equal(aq));
|
LuaAssert(L, aqds.size_and_steps_equal(aq));
|
||||||
|
|
||||||
// Change the queue size limit.
|
// Change the queue size limit.
|
||||||
|
|||||||
@@ -430,7 +430,7 @@ LuaDefine(unittests_idalloc, "c") {
|
|||||||
LuaAssert(L, ppds.make_patch(pp, &sb));
|
LuaAssert(L, ppds.make_patch(pp, &sb));
|
||||||
sb.write_uint32(0);
|
sb.write_uint32(0);
|
||||||
ppds.apply_patch(&sb);
|
ppds.apply_patch(&sb);
|
||||||
LuaAssert(L, sb.write_count() - sb.read_count() == 4);
|
LuaAssert(L, sb.total_writes() - sb.total_reads() == 4);
|
||||||
LuaAssert(L, ppds.exactly_equal(pp));
|
LuaAssert(L, ppds.exactly_equal(pp));
|
||||||
|
|
||||||
// Pop a value from master pool
|
// Pop a value from master pool
|
||||||
|
|||||||
@@ -64,9 +64,9 @@ void LuaSnap::serialize(StreamBuffer *sb) {
|
|||||||
|
|
||||||
// Write dummy length, use eris to write data, then overwrite length.
|
// Write dummy length, use eris to write data, then overwrite length.
|
||||||
sb->write_int64(0);
|
sb->write_int64(0);
|
||||||
int64_t pos1 = sb->write_count();
|
int64_t pos1 = sb->total_writes();
|
||||||
eris_dump(state_, sb->lua_writer, sb->lua_writer_ud());
|
eris_dump(state_, sb->lua_writer, sb->lua_writer_ud());
|
||||||
int64_t pos2 = sb->write_count();
|
int64_t pos2 = sb->total_writes();
|
||||||
sb->overwrite_int64(pos1, pos2 - pos1);
|
sb->overwrite_int64(pos1, pos2 - pos1);
|
||||||
lua_settop(state_, 0);
|
lua_settop(state_, 0);
|
||||||
std::cerr << "Eris dump is " << pos2-pos1 << " bytes." << std::endl;
|
std::cerr << "Eris dump is " << pos2-pos1 << " bytes." << std::endl;
|
||||||
|
|||||||
@@ -33,11 +33,11 @@ StreamBuffer::~StreamBuffer() {
|
|||||||
if (owned_ && (buf_lo_ != 0)) delete buf_lo_;
|
if (owned_ && (buf_lo_ != 0)) delete buf_lo_;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t StreamBuffer::read_count() const {
|
int64_t StreamBuffer::total_reads() const {
|
||||||
return (read_cursor_ - buf_lo_) + pre_read_count_;
|
return (read_cursor_ - buf_lo_) + pre_read_count_;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t StreamBuffer::write_count() const {
|
int64_t StreamBuffer::total_writes() const {
|
||||||
return (write_cursor_ - buf_lo_) + pre_read_count_;
|
return (write_cursor_ - buf_lo_) + pre_read_count_;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,8 +83,8 @@ void StreamBuffer::make_space_slow(int64_t bytes) {
|
|||||||
|
|
||||||
char *StreamBuffer::get_overwrite(int64_t size, int64_t write_count_after) {
|
char *StreamBuffer::get_overwrite(int64_t size, int64_t write_count_after) {
|
||||||
int64_t write_count_before = write_count_after - size;
|
int64_t write_count_before = write_count_after - size;
|
||||||
assert(write_count_before >= read_count());
|
assert(write_count_before >= total_reads());
|
||||||
assert(write_count_after <= write_count());
|
assert(write_count_after <= total_writes());
|
||||||
return buf_lo_ + (write_count_before - pre_read_count_);
|
return buf_lo_ + (write_count_before - pre_read_count_);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -386,13 +386,13 @@ void StreamBuffer::verify_eof() {
|
|||||||
|
|
||||||
void StreamBuffer::unread_to(int64_t rd_count) {
|
void StreamBuffer::unread_to(int64_t rd_count) {
|
||||||
assert(rd_count >= pre_read_count_);
|
assert(rd_count >= pre_read_count_);
|
||||||
assert(rd_count <= read_count());
|
assert(rd_count <= total_reads());
|
||||||
read_cursor_ = buf_lo_ + (rd_count - pre_read_count_);
|
read_cursor_ = buf_lo_ + (rd_count - pre_read_count_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void StreamBuffer::unwrite_to(int64_t wr_count) {
|
void StreamBuffer::unwrite_to(int64_t wr_count) {
|
||||||
assert(wr_count >= read_count());
|
assert(wr_count >= total_reads());
|
||||||
assert(wr_count <= write_count());
|
assert(wr_count <= total_writes());
|
||||||
write_cursor_ = buf_lo_ + (wr_count - pre_read_count_);
|
write_cursor_ = buf_lo_ + (wr_count - pre_read_count_);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -514,13 +514,13 @@ LuaDefine(unittests_streambuffer, "c") {
|
|||||||
|
|
||||||
// Check the write count and read count accumulator ability.
|
// Check the write count and read count accumulator ability.
|
||||||
sb11.clear();
|
sb11.clear();
|
||||||
assert(sb11.write_count() == 0);
|
assert(sb11.total_writes() == 0);
|
||||||
assert(sb11.read_count() == 0);
|
assert(sb11.total_reads() == 0);
|
||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
assert(sb11.write_count() == i * 8);
|
assert(sb11.total_writes() == i * 8);
|
||||||
sb11.write_int32(i);
|
sb11.write_int32(i);
|
||||||
sb11.write_int32(i+1000000);
|
sb11.write_int32(i+1000000);
|
||||||
assert(sb11.read_count() == i * 8);
|
assert(sb11.total_reads() == i * 8);
|
||||||
assert(sb11.read_int32() == i);
|
assert(sb11.read_int32() == i);
|
||||||
assert(sb11.read_int32() == i+1000000);
|
assert(sb11.read_int32() == i+1000000);
|
||||||
}
|
}
|
||||||
@@ -533,7 +533,7 @@ LuaDefine(unittests_streambuffer, "c") {
|
|||||||
for (int i = 0; i < 2; i++) {
|
for (int i = 0; i < 2; i++) {
|
||||||
sb11.write_int16(12);
|
sb11.write_int16(12);
|
||||||
sb11.write_int16(34);
|
sb11.write_int16(34);
|
||||||
int64_t wc = sb11.write_count();
|
int64_t wc = sb11.total_writes();
|
||||||
sb11.write_int16(56);
|
sb11.write_int16(56);
|
||||||
sb11.write_int16(78);
|
sb11.write_int16(78);
|
||||||
sb11.overwrite_int16(wc, 90);
|
sb11.overwrite_int16(wc, 90);
|
||||||
|
|||||||
@@ -49,9 +49,9 @@
|
|||||||
// streambuffer.write_int32(0);
|
// streambuffer.write_int32(0);
|
||||||
//
|
//
|
||||||
// // Write the data, and calculate its length in bytes.
|
// // Write the data, and calculate its length in bytes.
|
||||||
// int64_t write_count_1 = streambuffer.write_count();
|
// int64_t write_count_1 = streambuffer.total_writes();
|
||||||
// write_data(stream);
|
// write_data(stream);
|
||||||
// int64_t write_count_2 = streambuffer.write_count();
|
// int64_t write_count_2 = streambuffer.total_writes();
|
||||||
// int64_t data_len = write_count_2 - write_count_1;
|
// int64_t data_len = write_count_2 - write_count_1;
|
||||||
//
|
//
|
||||||
// // Overwrite the previously-written dummy length.
|
// // Overwrite the previously-written dummy length.
|
||||||
@@ -130,7 +130,7 @@
|
|||||||
// Here is the construction that accomplishes this:
|
// Here is the construction that accomplishes this:
|
||||||
//
|
//
|
||||||
// // Get the stream's read count before parsing the message.
|
// // Get the stream's read count before parsing the message.
|
||||||
// size_t read_count_before = streambuffer.read_count();
|
// size_t read_count_before = streambuffer.total_reads();
|
||||||
//
|
//
|
||||||
// // Parse the message, but if there's an EOF, deal with it:
|
// // Parse the message, but if there's an EOF, deal with it:
|
||||||
// try {
|
// try {
|
||||||
@@ -164,7 +164,7 @@
|
|||||||
//
|
//
|
||||||
// A StreamBuffer that reads from an external block of bytes is read-only.
|
// A StreamBuffer that reads from an external block of bytes is read-only.
|
||||||
// Attempts to write to this buffer will be caught and will cause an abort. The
|
// Attempts to write to this buffer will be caught and will cause an abort. The
|
||||||
// write_count for such a buffer returns the 'len' value that you initialized
|
// total_writes for such a buffer returns the 'len' value that you initialized
|
||||||
// the buffer with.
|
// the buffer with.
|
||||||
//
|
//
|
||||||
// USING A STREAMBUFFER TO READ AN ENTIRE FILE
|
// USING A STREAMBUFFER TO READ AN ENTIRE FILE
|
||||||
@@ -251,13 +251,13 @@ public:
|
|||||||
~StreamBuffer();
|
~StreamBuffer();
|
||||||
|
|
||||||
// Get the total number of bytes ever read from this buffer.
|
// Get the total number of bytes ever read from this buffer.
|
||||||
int64_t read_count() const;
|
int64_t total_reads() const;
|
||||||
|
|
||||||
// Get the total number of bytes ever written to this buffer.
|
// Get the total number of bytes ever written to this buffer.
|
||||||
int64_t write_count() const;
|
int64_t total_writes() const;
|
||||||
|
|
||||||
// Delete all data and (if not fixed-size) free the buffer.
|
// Discard all data. Reset total read and write counts.
|
||||||
// Also resets the read and write counts.
|
// Frees up as much space as possible.
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
// Write block of bytes into the buffer.
|
// Write block of bytes into the buffer.
|
||||||
@@ -269,7 +269,7 @@ public:
|
|||||||
|
|
||||||
// Read a block of bytes from the buffer.
|
// Read a block of bytes from the buffer.
|
||||||
//
|
//
|
||||||
// May throw StreamEof if the specified number of bytes aren't present.
|
// Throws StreamEof if the specified number of bytes aren't present.
|
||||||
//
|
//
|
||||||
const char *read_bytes(int64_t bytes);
|
const char *read_bytes(int64_t bytes);
|
||||||
|
|
||||||
@@ -316,7 +316,7 @@ public:
|
|||||||
|
|
||||||
// Read other types from the buffer.
|
// Read other types from the buffer.
|
||||||
//
|
//
|
||||||
// May throw StreamEof if the specified number of bytes aren't present.
|
// Throws StreamEof if the specified number of bytes aren't present.
|
||||||
// Read string with a length limit will throw 'StreamCorruption' if the
|
// Read string with a length limit will throw 'StreamCorruption' if the
|
||||||
// length is too long.
|
// length is too long.
|
||||||
//
|
//
|
||||||
@@ -345,10 +345,10 @@ public:
|
|||||||
void verify_eof();
|
void verify_eof();
|
||||||
|
|
||||||
// Rewind the read cursor to a previous position.
|
// Rewind the read cursor to a previous position.
|
||||||
void unread_to(int64_t read_count);
|
void unread_to(int64_t total_reads);
|
||||||
|
|
||||||
// Rewind the write cursor to a previous position.
|
// Rewind the write cursor to a previous position.
|
||||||
void unwrite_to(int64_t write_count);
|
void unwrite_to(int64_t total_writes);
|
||||||
|
|
||||||
// Calculate a noncryptographic but good hash of what's in the buffer.
|
// Calculate a noncryptographic but good hash of what's in the buffer.
|
||||||
util::HashValue hash() const;
|
util::HashValue hash() const;
|
||||||
|
|||||||
@@ -316,6 +316,45 @@ LuaDefine(deque_nthr, "c") {
|
|||||||
return LS.result();
|
return LS.result();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LuaDefine(deque_findl, "c") {
|
||||||
|
LuaArg deque, val;
|
||||||
|
LuaRet pos;
|
||||||
|
LuaVar check;
|
||||||
|
LuaStack LS(L, deque, val, pos, check);
|
||||||
|
int left, fill, max;
|
||||||
|
deque_get_info(L, deque.index(), &left, &fill, &max);
|
||||||
|
for (int i = 0; i < fill; i++) {
|
||||||
|
int index = (left + i) & (max - 1);
|
||||||
|
LS.rawgeti(check, deque, DEQUE_BASE + index);
|
||||||
|
if (LS.rawequal(check, val)) {
|
||||||
|
LS.set(pos, i + 1);
|
||||||
|
return LS.result();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LS.set(pos, LuaNil);
|
||||||
|
return LS.result();
|
||||||
|
}
|
||||||
|
|
||||||
|
LuaDefine(deque_findr, "c") {
|
||||||
|
LuaArg deque, val;
|
||||||
|
LuaRet pos;
|
||||||
|
LuaVar check;
|
||||||
|
LuaStack LS(L, deque, val, pos, check);
|
||||||
|
int left, fill, max;
|
||||||
|
deque_get_info(L, deque.index(), &left, &fill, &max);
|
||||||
|
int base = left + fill - 1;
|
||||||
|
for (int i = 0; i < fill; i++) {
|
||||||
|
int index = (base - i) & (max - 1);
|
||||||
|
LS.rawgeti(check, deque, DEQUE_BASE + index);
|
||||||
|
if (LS.rawequal(check, val)) {
|
||||||
|
LS.set(pos, i + 1);
|
||||||
|
return LS.result();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LS.set(pos, LuaNil);
|
||||||
|
return LS.result();
|
||||||
|
}
|
||||||
|
|
||||||
LuaDefine(deque_size, "c") {
|
LuaDefine(deque_size, "c") {
|
||||||
LuaArg deque;
|
LuaArg deque;
|
||||||
LuaRet size;
|
LuaRet size;
|
||||||
|
|||||||
@@ -1,30 +1,8 @@
|
|||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// TABLE
|
|
||||||
//
|
|
||||||
// This module contains a library of lua functions
|
// This module contains a library of lua functions
|
||||||
// for manipulating tables. Some of the functions only
|
// for manipulating tables. It also provides a library
|
||||||
// work on vectors (ie, tables with integer keys starting
|
// of useful classes based on tables.
|
||||||
// at one). When a function only works on vectors, it
|
|
||||||
// is noted.
|
|
||||||
//
|
|
||||||
// QUEUE
|
|
||||||
//
|
|
||||||
// This module contains a library of lua functions for
|
|
||||||
// manipulating queues. Queues are represented as a table
|
|
||||||
// with a "head" and a "tail", and with integer-keyed values.
|
|
||||||
// For example:
|
|
||||||
//
|
|
||||||
// {
|
|
||||||
// "tail": 100,
|
|
||||||
// "head": 103,
|
|
||||||
// 100: "a",
|
|
||||||
// 101: "b",
|
|
||||||
// 102: "c"
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Values are pushed onto the head, and values are popped
|
|
||||||
// from the tail.
|
|
||||||
//
|
//
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@@ -80,7 +58,7 @@ int table_count(lua_State *L);
|
|||||||
int table_clear(lua_State *L);
|
int table_clear(lua_State *L);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Create and return an empty queue. Queues are implemented
|
// Create and return an empty deque. Queues are implemented
|
||||||
// as tables which are used as dynamically-expandable circular
|
// as tables which are used as dynamically-expandable circular
|
||||||
// buffers.
|
// buffers.
|
||||||
//
|
//
|
||||||
@@ -107,6 +85,15 @@ int deque_popr(lua_State *L);
|
|||||||
int deque_nthl(lua_State *L);
|
int deque_nthl(lua_State *L);
|
||||||
int deque_nthr(lua_State *L);
|
int deque_nthr(lua_State *L);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Search a deque for a value.
|
||||||
|
//
|
||||||
|
// Search starts on the specified end and indices are relative
|
||||||
|
// to specified end.
|
||||||
|
//
|
||||||
|
int deque_findl(lua_State *L);
|
||||||
|
int deque_findr(lua_State *L);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Return the number of values in the deque.
|
// Return the number of values in the deque.
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1,19 +0,0 @@
|
|||||||
|
|
||||||
#include "viewer.hpp"
|
|
||||||
|
|
||||||
Viewer::Viewer() {
|
|
||||||
world_.reset(new World);
|
|
||||||
world_->init_standalone();
|
|
||||||
}
|
|
||||||
|
|
||||||
Viewer::~Viewer() {
|
|
||||||
}
|
|
||||||
|
|
||||||
int64_t Viewer::get_player_id() {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Viewer::update_gui(int64_t place, Gui *gui) {
|
|
||||||
world_->update_gui(get_player_id(), place, gui);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
#ifndef VIEWER_HPP
|
|
||||||
#define VIEWER_HPP
|
|
||||||
|
|
||||||
#include "world.hpp"
|
|
||||||
#include "animqueue.hpp"
|
|
||||||
#include "gui.hpp"
|
|
||||||
#include <vector>
|
|
||||||
#include <string>
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
class Viewer {
|
|
||||||
private:
|
|
||||||
std::unique_ptr<World> world_;
|
|
||||||
|
|
||||||
public:
|
|
||||||
Viewer();
|
|
||||||
~Viewer();
|
|
||||||
|
|
||||||
// Snapshot/rollback the lua state (temporary hack)
|
|
||||||
void snapshot() { world_->lua_snap_.snapshot(); }
|
|
||||||
void rollback() { world_->lua_snap_.rollback(); }
|
|
||||||
|
|
||||||
// Get the lua state for interaction.
|
|
||||||
//
|
|
||||||
lua_State *state() { return world_->state(); }
|
|
||||||
|
|
||||||
// Get the player ID of the current player.
|
|
||||||
//
|
|
||||||
int64_t get_player_id();
|
|
||||||
|
|
||||||
// Get the list of tangibles near the player.
|
|
||||||
//
|
|
||||||
std::vector<int64_t> get_near() { return world_->get_near(1, 100); }
|
|
||||||
|
|
||||||
// Get the specified tangible.
|
|
||||||
//
|
|
||||||
const Tangible *tangible_get(int64_t id) { return world_->tangible_get(id); }
|
|
||||||
|
|
||||||
// Update the GUI for the specified sprite.
|
|
||||||
//
|
|
||||||
// The gui passed in will be overwritten.
|
|
||||||
//
|
|
||||||
void update_gui(int64_t id, Gui *g);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // VIEWER_HPP
|
|
||||||
@@ -429,7 +429,7 @@ void World::run_scheduled_threads(int64_t clk) {
|
|||||||
void World::serialize(StreamBuffer *sb) {
|
void World::serialize(StreamBuffer *sb) {
|
||||||
assert(stack_is_clear());
|
assert(stack_is_clear());
|
||||||
assert(redirects_.empty());
|
assert(redirects_.empty());
|
||||||
int64_t wc0 = sb->write_count();
|
int64_t wc0 = sb->total_writes();
|
||||||
lua_snap_.serialize(sb);
|
lua_snap_.serialize(sb);
|
||||||
id_global_pool_.serialize(sb);
|
id_global_pool_.serialize(sb);
|
||||||
thread_sched_.serialize(sb);
|
thread_sched_.serialize(sb);
|
||||||
@@ -438,7 +438,7 @@ void World::serialize(StreamBuffer *sb) {
|
|||||||
sb->write_int64(p.first);
|
sb->write_int64(p.first);
|
||||||
p.second->serialize(sb);
|
p.second->serialize(sb);
|
||||||
}
|
}
|
||||||
int64_t wc1 = sb->write_count();
|
int64_t wc1 = sb->total_writes();
|
||||||
std::cerr << "World serialized to " << wc1-wc0 << " bytes." << std::endl;
|
std::cerr << "World serialized to " << wc1-wc0 << " bytes." << std::endl;
|
||||||
assert(stack_is_clear());
|
assert(stack_is_clear());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user