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