diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2015-04-17 09:56:04 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2015-04-17 09:56:04 -0700 |
commit | 9da1b126cc017e14035b94c4615d211e5bc4bb21 (patch) | |
tree | a69baf5f6b75be08e68003a725d33cd478659b56 /cpp/020array | |
parent | c8087de8d99a4c3c4264eb89e4d0b35a4fb2c816 (diff) | |
download | mu-9da1b126cc017e14035b94c4615d211e5bc4bb21.tar.gz |
1072
Diffstat (limited to 'cpp/020array')
-rw-r--r-- | cpp/020array | 157 |
1 files changed, 0 insertions, 157 deletions
diff --git a/cpp/020array b/cpp/020array deleted file mode 100644 index 9c2f1439..00000000 --- a/cpp/020array +++ /dev/null @@ -1,157 +0,0 @@ -//: Arrays contain a variable number of elements of the same type. -:(scenario copy_array) -# Arrays can be copied around with a single instruction just like integers, -# no matter how large they are. -recipe main [ - 1:integer <- copy 3:literal - 2:integer <- copy 14:literal - 3:integer <- copy 15:literal - 4:integer <- copy 16:literal - 5:array:integer <- copy 1:array:integer -] -+run: instruction main/4 -+run: ingredient 0 is 1 -+mem: location 1 is 3 -+mem: location 2 is 14 -+mem: location 3 is 15 -+mem: location 4 is 16 -+mem: storing 3 in location 5 -+mem: storing 14 in location 6 -+mem: storing 15 in location 7 -+mem: storing 16 in location 8 - -//: disable the size mismatch check since the destination array need not be initialized -:(replace "if (size_of(x) != data.size())" following "void write_memory(reagent x, vector<int> data)") -if (x.types[0] != Type_number["array"] && size_of(x) != data.size()) -:(after "size_t size_of(const reagent& r)") - static const int ARRAY = Type_number["array"]; - if (r.types[0] == ARRAY) { - assert(r.types.size() > 1); - // skip the 'array' type to get at the element type - return 1 + Memory[r.value]*size_of(array_element(r.types)); - } - -//: array elements are accessed using 'index' -:(scenario "index") -recipe main [ - 1:integer <- copy 3:literal - 2:integer <- copy 14:literal - 3:integer <- copy 15:literal - 4:integer <- copy 16:literal - 5:integer <- index 1:array:integer, 0:literal -] -+run: instruction main/4 -+run: address to copy is 2 -+run: its type is 1 -+mem: location 2 is 14 -+run: product 0 is 14 -+mem: storing 14 in location 5 - -//: array elements are accessed using 'index' -:(scenario "index_direct_offset") -recipe main [ - 1:integer <- copy 3:literal - 2:integer <- copy 14:literal - 3:integer <- copy 15:literal - 4:integer <- copy 16:literal - 5:integer <- copy 0:literal - 6:integer <- index 1:array:integer, 5:integer -] -+run: instruction main/5 -+run: address to copy is 2 -+run: its type is 1 -+mem: location 2 is 14 -+run: product 0 is 14 -+mem: storing 14 in location 6 - -:(before "End Globals") -// Operator to look at elements of arrays. -const int INDEX = 20; -:(before "End Primitive Recipe Numbers") -Recipe_number["index"] = INDEX; -assert(Next_recipe_number == INDEX); -Next_recipe_number++; -:(before "End Primitive Recipe Implementations") -case INDEX: { - static const int ARRAY = Type_number["array"]; -//? if (Trace_stream) Trace_stream->dump_layer = "run"; //? 1 - trace("run") << "ingredient 0 is " << instructions[pc].ingredients[0].to_string(); - reagent base = canonize(instructions[pc].ingredients[0]); -//? trace("run") << "ingredient 0 after canonize: " << instructions[pc].ingredients[0].to_string(); //? 1 - int base_address = base.value; - assert(base.types[0] == ARRAY); - trace("run") << "ingredient 1 is " << instructions[pc].ingredients[1].to_string(); - reagent offset = canonize(instructions[pc].ingredients[1]); - vector<int> offset_val(read_memory(offset)); - vector<type_number> element_type = array_element(base.types); - int src = base_address + 1 + offset_val[0]*size_of(element_type); - trace("run") << "address to copy is " << src; - trace("run") << "its type is " << element_type[0]; - reagent tmp; - tmp.set_value(src); - copy(element_type.begin(), element_type.end(), inserter(tmp.types, tmp.types.begin())); - tmp.properties.push_back(pair<string, vector<string> >("raw", vector<string>())); -//? cout << "AAA: " << tmp.to_string() << '\n'; //? 2 - vector<int> result(read_memory(tmp)); - trace("run") << "product 0 is " << result[0]; - write_memory(instructions[pc].products[0], result); -//? if (Trace_stream) Trace_stream->dump_layer = ""; //? 1 - break; -} - -:(code) -vector<type_number> array_element(const vector<type_number>& types) { - return vector<type_number>(++types.begin(), types.end()); -} - -:(scenario "index_address") -recipe main [ - 1:integer <- copy 3:literal - 2:integer <- copy 14:literal - 3:integer <- copy 15:literal - 4:integer <- copy 16:literal - 5:integer <- index-address 1:array:integer, 0:literal -] -+run: instruction main/4 -+run: address to copy is 2 -+mem: storing 2 in location 5 - -:(before "End Globals") -// To write to elements of containers, you need their address. -const int INDEX_ADDRESS = 21; -:(before "End Primitive Recipe Numbers") -Recipe_number["index-address"] = INDEX_ADDRESS; -assert(Next_recipe_number == INDEX_ADDRESS); -Next_recipe_number++; -:(before "End Primitive Recipe Implementations") -case INDEX_ADDRESS: { - static const int ARRAY = Type_number["array"]; - trace("run") << "ingredient 0 is " << instructions[pc].ingredients[0].name; - reagent base = canonize(instructions[pc].ingredients[0]); - int base_address = base.value; - assert(base.types[0] == ARRAY); - trace("run") << "ingredient 1 is " << instructions[pc].ingredients[1].to_string(); - reagent offset = canonize(instructions[pc].ingredients[1]); - vector<int> offset_val(read_memory(offset)); - vector<type_number> element_type = array_element(base.types); - int src = base_address + 1 + offset_val[0]*size_of(element_type); - trace("run") << "address to copy is " << src; - vector<int> result; - result.push_back(src); - trace("run") << "product 0 is " << result[0]; - write_memory(instructions[pc].products[0], result); - break; -} - -:(scenario "index_indirect") -recipe main [ - 1:integer <- copy 3:literal - 2:integer <- copy 14:literal - 3:integer <- copy 15:literal - 4:integer <- copy 16:literal - 5:address:array:integer <- copy 1:literal - 6:integer <- index 5:address:array:integer/deref, 1:literal -] -+run: instruction main/5 -+mem: storing 15 in location 6 -// vim:ft=cpp |