www.gusucode.com > mbc 工具箱 matlab 源码程序 > mbc/@xregpointer/private/HeapManager.m
function info=HeapManager(Action,ptr,info) %HEAPMANAGER Private Heap Manager for pointers % % INFO = HEAPMANAGER(ACTION, PTR, INFO) % Copyright 2000-2008 The MathWorks, Inc. and Ford Global Technologies, Inc. persistent MVHEAP USED_HEAP if isempty(MVHEAP) MVHEAP = cell(1,2^10); USED_HEAP = false(1,2^10); mlock; end % Action codes: % % 0: info % 1: infoarray % 2: set % 3: setarray % 4: new % 5: free % 6: clear % 7: save % 8: load % 9: isvalid switch Action case 0 %info if numel(ptr)==1 if ptr && USED_HEAP(ptr); info = MVHEAP{ptr}; else error(message('mbc:xregpointer:InvalidPointerReference')); end else if all(ptr(:)) && all(USED_HEAP(ptr(:))); info = MVHEAP(ptr); else error(message('mbc:xregpointer:InvalidPointerReference1')); end end case 1 %infoarray if all(ptr(:)) && all(USED_HEAP(ptr(:))) info = reshape(MVHEAP(ptr),size(ptr)); else error(message('mbc:xregpointer:InvalidPointerReference2')); end case 2 %set if ptr && USED_HEAP(ptr) MVHEAP{ptr} = info; else error(message('mbc:xregpointer:InvalidPointerReference')); end case 3 %set array if all(USED_HEAP(ptr(:))) MVHEAP(ptr) = info; else error(message('mbc:xregpointer:InvalidPointerReference4')); end case 4 %new % % Number of new pointers required is in argument 2. New items to % store are optionally in argument 3. Nrequired = ptr; ptr = find(~USED_HEAP,Nrequired,'first'); if length(ptr)<Nrequired % increase the size of the heap lenHeap = length(USED_HEAP); ptr = [ptr lenHeap+1:lenHeap+Nrequired-length(ptr)]; NewLen = ceil(ptr(end)/2^10)*2^10 - lenHeap; USED_HEAP = [ USED_HEAP false(1,NewLen)]; MVHEAP = [ MVHEAP cell(1,NewLen)]; end USED_HEAP(ptr) = true; if nargin > 2 % assign new info to heap MVHEAP(ptr) = info; end % Return heap location of new items info = ptr; case 5 %free ptr = ptr(:)'; if ~all(ptr) ptr = ptr(ptr~=0); warning(message('mbc:xregpointer:InvalidPointerReference5')); end f = USED_HEAP(ptr); if ~all(f) warning(message('mbc:xregpointer:InvalidPointerReference6')); ptr(~f) = []; end % temp copy of old heap so you can do internal free OldHeap = MVHEAP(ptr); % free heap USED_HEAP(ptr) = false; MVHEAP(ptr) = {[]}; % recursive free cellfun(@freeptr,OldHeap); case 6 % clear MVHEAP = []; USED_HEAP = []; case 7 % save heap Heap.MVHEAP = MVHEAP; Heap.USED_HEAP = find(USED_HEAP)'; info = Heap; case 8 %restore heap Heap = ptr; MVHEAP = Heap.MVHEAP; USED_HEAP = false(1,Heap.USED_HEAP(end)); USED_HEAP(Heap.USED_HEAP) = true; case 9 % checks if pointer is valid info = false(size(ptr)); ind = ptr~=0; ptr = ptr(ind); info(ind) = USED_HEAP(ptr); otherwise error(message('mbc:xregpointer:InvalidArgument6')); end