view Map.m @ 415:16907bf31e67 feature/better_map

Overload indexing operations.
author Jonatan Werpers <jonatan@werpers.com>
date Thu, 02 Feb 2017 16:22:47 +0100
parents 50fd7e88aa74
children e97550b5c1e7
line wrap: on
line source

classdef Map < handle
    properties
        map
    end

    % can we support multi map using varargin?

    methods
        function obj = Map()
            obj.map = containers.Map()
        end

        function set(obj, k, v)
            keyByteStream = getByteStreamFromArray(k);

            obj.map(char(keyByteStream)) = v;
        end

        function v = get(obj, k)
            keyByteStream = getByteStreamFromArray(k);

            v = obj.map(char(keyByteStream));
        end

        function b = isKey(obj, k)
            keyByteStream = getByteStreamFromArray(k);
            b = obj.map.isKey(keyByteStream);
        end

        function c = keys(obj)
            keyByteStreams = obj.map.keys;

            n = length(keyByteStreams);

            c = cell(1, n);
            for i = 1:n
                c{i} = getArrayFromByteStream(uint8(keyByteStreams{i}));
            end
        end

        function l = length(obj)
            l = obj.map.length;
        end

        function remove(obj, k)
            keyByteStream = getByteStreamFromArray(k);
            obj.map.remove(char(keyByteStream));
        end

        function s = size(obj)
            s = obj.map.size;
        end

        function c = values(obj)
            c = obj.map.values;
        end

        function v = subsref(obj, S)
            switch S.type
                case '()'
                    k = S.subs;
                    try
                        v = obj.get(k);
                    catch ME
                        if strcmp(ME.identifier,'MATLAB:Containers:Map:NoKey')
                            error('Reference to non-existent entry %s',toString(S.subs));
                        else
                            throw(ME);
                        end
                    end
                otherwise
                    v = builtin('subsref', obj, S);
            end
        end

        function obj = subsasgn(obj, S, v);
            switch S.type
                case '()'
                    k = S.subs;
                    obj.set(k, v);
                otherwise
                    error('Unsupported indexing operator: %s',S.type);
            end
        end
    end
end