// 2010.02.28 # Doj
// В связи с созданием отдельного стека блоков, этот модуль стал устаревшим.
// 2010.12.03 # Doj
// В этом модуле реализуются типы со счётчиком ссылок.
// Каждый такой тип представляет из себя указатель, ссылающийся на память,
// в первой ячейке которой хранится счётчик, а дальше значение, зависящее
// от типа. Равенство счётчика нулю говорит о том, что необходимо высвободить
// значение из памяти, вызвав free.

str" units\utils\debug.de" evaluate-file

// Увеличить число ссылок
: cinc ( p-) 0; 1+! ;
// Уменьшить число ссылок, если требуется освободить, то сделать это
: cdec ( p-) 0; dup @ -1 = if exit then dup 1-! dup @ 0= if free else drop then ;

// стандартные стековые операции
: cdrop ( c-) cdec ;
: cdup ( c-cc) dup dup cinc ;
: cnip ( cc-c) over cdec nip ;
: cswap ( cc-cc) swap ;
: cover ( ab-aba) over dup cinc ;
: ctuck ( ab-bab) tuck dup cinc ;
: clrot ( abc-bca) lrot ;
: crrot ( abc-cab) rrot ;
: clrotn ( c..ci-c..c) lrotn ;
: crrotn ( c..ci-c..c) rrotn ;
: cpick ( c..ci-c..cc) pick dup cinc ;

// память, переменные
: c@ ( p-c) @ dup cinc ;
: c! ( cp-) dup @ cdec cover cinc ! ;
// TODO
// : (cto) ( c-) r> dup cell+ r> @ xt.d@ c! ;
// : [cto] ( c "name"-) compile (cto) source-next-name o, ; immediate
// : cto ( c "name"-) state @ if ['] [cto] execute else dup ['] to execute cinc then ; immediate
: cvalue ( c "name"-) create , does> @ dup cinc ;
: cconstant ( c "name"-) create , does> @ dup cinc ;
: cvariable ( "name") create 0 , ;
// TODO
// : r@cell+ ( -i) r> dup cell+ r> @ ;
// : (cliteral) ( -c) r> dup @ swap dup cell+ rrot + r> ;
// : cliteral ( c-) compile (cliteral) dup msize dup cell+ , here swap move ;

: cl! ( ci-) l! ;
: cl@ ( i-c) l@ dup cinc ;
