Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 26 additions & 6 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
cmake_minimum_required(VERSION 3.20 FATAL_ERROR)
message( "Configuring: ${CMAKE_CURRENT_SOURCE_DIR}")

set(CMAKE_PROJECT_VERSION 0.0.0 )
set(CMAKE_PROJECT_VERSION 0.0.1 )

# Project name
project( avm
Expand All @@ -23,11 +23,14 @@ set( CMAKE_CXX_EXTENSIONS OFF )
# Name of executable
add_executable( ${TARGET_NAME} )

link_directories(
"${CMAKE_CURRENT_SOURCE_DIR}/3p" )
# LinksPlatform dependency (Windows only)
if( WIN32 )
link_directories(
"${CMAKE_CURRENT_SOURCE_DIR}/3p" )

target_link_libraries(${PROJECT_NAME} PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/3p/doublets_ffi.dll.lib" )
target_link_libraries(${PROJECT_NAME} PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/3p/doublets_ffi.dll.lib" )
endif()

# Adding build-requirements
target_include_directories( ${TARGET_NAME} PRIVATE
Expand All @@ -36,9 +39,26 @@ target_include_directories( ${TARGET_NAME} PRIVATE

target_sources( ${TARGET_NAME} PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/include/avm.h"
"${CMAKE_CURRENT_SOURCE_DIR}/include/json_io.h"
"${CMAKE_CURRENT_SOURCE_DIR}/include/anumber.h"
"${CMAKE_CURRENT_SOURCE_DIR}/3p/UnitedMemoryLinks.h"
"${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp" )
"${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp" )

if( WIN32 )
add_definitions(-DUNICODE -D_UNICODE)
endif()

# Test target for anumber serialization/deserialization
add_executable( test_anumber
"${CMAKE_CURRENT_SOURCE_DIR}/test/src/test_anumber.cpp" )

target_include_directories( test_anumber PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/include"
"${CMAKE_CURRENT_SOURCE_DIR}/3p" )

if( WIN32 )
target_link_libraries( test_anumber PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/3p/doublets_ffi.dll.lib" )
endif()

add_test( NAME test_anumber COMMAND test_anumber )
57 changes: 57 additions & 0 deletions experiments/debug_string.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
#include "json_io.h"
#include <iostream>
using namespace std;

void debug_rel(const rel_t* ent, string indent = "") {
if (ent == rel_t::E) { cout << indent << "E" << endl; return; }
if (ent == rel_t::R) { cout << indent << "R" << endl; return; }
if (ent == rel_t::True) { cout << indent << "True" << endl; return; }
if (ent == rel_t::False) { cout << indent << "False" << endl; return; }
if (ent == rel_t::Unsigned) { cout << indent << "Unsigned" << endl; return; }
if (ent == rel_t::Integer) { cout << indent << "Integer" << endl; return; }
if (ent == rel_t::Float) { cout << indent << "Float" << endl; return; }

cout << indent << "rel(" << (void*)ent << "):" << endl;
cout << indent << " obj: ";
if (ent->obj == rel_t::E) cout << "E" << endl;
else if (ent->obj == rel_t::R) cout << "R" << endl;
else if (ent->obj == rel_t::True) cout << "True" << endl;
else if (ent->obj == rel_t::False) cout << "False" << endl;
else cout << "rel(" << (void*)ent->obj << ")" << endl;

cout << indent << " sub: ";
if (ent->sub == rel_t::E) cout << "E" << endl;
else if (ent->sub == rel_t::R) cout << "R" << endl;
else if (ent->sub == rel_t::True) cout << "True" << endl;
else if (ent->sub == rel_t::False) cout << "False" << endl;
else cout << "rel(" << (void*)ent->sub << ")" << endl;
}

void trace_string_encoding(const rel_t* ent, int depth = 0) {
if (depth > 20) { cout << " ... (max depth)" << endl; return; }
debug_rel(ent, string(depth*2, ' '));
if (ent != rel_t::E && ent != rel_t::R && ent != rel_t::True &&
ent != rel_t::False && ent != rel_t::Unsigned &&
ent != rel_t::Integer && ent != rel_t::Float) {
cout << string(depth*2, ' ') << " -> obj detail:" << endl;
trace_string_encoding(ent->obj, depth+1);
cout << string(depth*2, ' ') << " -> sub detail:" << endl;
trace_string_encoding(ent->sub, depth+1);
}
}

int main() {
// Import string "a"
json j = json("a");
rel_t* str_rel = import_json(j);

cout << "=== String 'a' structure ===" << endl;
trace_string_encoding(str_rel);

cout << endl << "=== Export back ===" << endl;
json result;
export_json(str_rel, result);
cout << "Result: " << result.dump() << endl;

return 0;
}
108 changes: 108 additions & 0 deletions experiments/debug_structure.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
#include "json_io.h"
#include <iostream>
using namespace std;

void print_rel(const rel_t* ent, string name = "", int depth = 0) {
string indent(depth*2, ' ');
if (!name.empty()) cout << indent << name << ": ";
else cout << indent;

if (ent == rel_t::E) { cout << "E (null)" << endl; return; }
if (ent == rel_t::R) { cout << "R (array)" << endl; return; }
if (ent == rel_t::True) { cout << "True" << endl; return; }
if (ent == rel_t::False) { cout << "False" << endl; return; }
if (ent == rel_t::Unsigned) { cout << "Unsigned" << endl; return; }
if (ent == rel_t::Integer) { cout << "Integer" << endl; return; }
if (ent == rel_t::Float) { cout << "Float" << endl; return; }

cout << "rel@" << (void*)ent << endl;
if (depth < 10) {
print_rel(ent->obj, "obj", depth+1);
print_rel(ent->sub, "sub", depth+1);
}
}

int main() {
cout << "=== Base vocabulary ===" << endl;
cout << "E: obj="; print_rel(rel_t::E->obj, "", 0);
cout << "E: sub="; print_rel(rel_t::E->sub, "", 0);
cout << "R: obj="; print_rel(rel_t::R->obj, "", 0);
cout << "R: sub="; print_rel(rel_t::R->sub, "", 0);
cout << "True: obj="; print_rel(rel_t::True->obj, "", 0);
cout << "True: sub="; print_rel(rel_t::True->sub, "", 0);
cout << "False: obj="; print_rel(rel_t::False->obj, "", 0);
cout << "False: sub="; print_rel(rel_t::False->sub, "", 0);

cout << endl << "=== null ===" << endl;
json j_null = json(nullptr);
rel_t* null_r = import_json(j_null);
print_rel(null_r, "null");

cout << endl << "=== [true] ===" << endl;
json j_arr = json::array({true});
rel_t* arr_r = import_json(j_arr);
print_rel(arr_r, "[true]");

cout << endl << "=== [true, false] ===" << endl;
json j_arr2 = json::array({true, false});
rel_t* arr2_r = import_json(j_arr2);
print_rel(arr2_r, "[true, false]");

cout << endl << "=== \"a\" ===" << endl;
json j_str = json("a");
rel_t* str_r = import_json(j_str);
// Only show top 4 levels
cout << "str: rel@" << (void*)str_r << endl;
cout << " obj: ";
if (str_r->obj == rel_t::E) cout << "E" << endl;
else if (str_r->obj == rel_t::R) cout << "R" << endl;
else cout << "rel@" << (void*)str_r->obj << endl;
cout << " sub: ";
if (str_r->sub == rel_t::E) cout << "E" << endl;
else if (str_r->sub == rel_t::R) cout << "R" << endl;
else cout << "rel@" << (void*)str_r->sub << endl;

// Traverse the bit chain
cout << endl << "=== Bit chain for \"a\" ===" << endl;
const rel_t* cur = str_r;
int level = 0;
while (cur != rel_t::E && cur != rel_t::R && level < 20) {
string obj_name = "?", sub_name = "?";
if (cur->obj == rel_t::E) obj_name = "E";
else if (cur->obj == rel_t::R) obj_name = "R";
else if (cur->obj == rel_t::True) obj_name = "True";
else if (cur->obj == rel_t::False) obj_name = "False";
else obj_name = "rel@" + to_string((uintptr_t)cur->obj);

if (cur->sub == rel_t::E) sub_name = "E";
else if (cur->sub == rel_t::R) sub_name = "R";
else if (cur->sub == rel_t::True) sub_name = "True";
else if (cur->sub == rel_t::False) sub_name = "False";
else sub_name = "rel@" + to_string((uintptr_t)cur->sub);

cout << "Level " << level << ": obj=" << obj_name << " sub=" << sub_name << endl;

// Go deeper through obj (the chain direction)
cur = cur->obj;
level++;
}
if (cur == rel_t::E) cout << "End: E" << endl;
if (cur == rel_t::R) cout << "End: R" << endl;

cout << endl << "=== 42u ===" << endl;
json j_num = json(42u);
rel_t* num_r = import_json(j_num);
cout << "num: rel@" << (void*)num_r << endl;
cout << " obj: ";
if (num_r->obj == rel_t::E) cout << "E" << endl;
else if (num_r->obj == rel_t::R) cout << "R" << endl;
else if (num_r->obj == rel_t::Unsigned) cout << "Unsigned" << endl;
else cout << "rel@" << (void*)num_r->obj << endl;
cout << " sub: ";
if (num_r->sub == rel_t::E) cout << "E" << endl;
else if (num_r->sub == rel_t::R) cout << "R" << endl;
else if (num_r->sub == rel_t::Unsigned) cout << "Unsigned" << endl;
else cout << "rel@" << (void*)num_r->sub << endl;

return 0;
}
Loading