From: <hi...@us...> - 2009-10-02 09:46:43
|
Revision: 6291 http://octave.svn.sourceforge.net/octave/?rev=6291&view=rev Author: highegg Date: 2009-10-02 09:46:32 +0000 (Fri, 02 Oct 2009) Log Message: ----------- more dict improvements Modified Paths: -------------- trunk/octave-forge/main/general/inst/@dict/get.m trunk/octave-forge/main/general/inst/__lookup_compat__.m Added Paths: ----------- trunk/octave-forge/main/general/inst/@dict/join.m trunk/octave-forge/main/general/inst/__merge_compat__.m Modified: trunk/octave-forge/main/general/inst/@dict/get.m =================================================================== --- trunk/octave-forge/main/general/inst/@dict/get.m 2009-10-02 09:27:39 UTC (rev 6290) +++ trunk/octave-forge/main/general/inst/@dict/get.m 2009-10-02 09:46:32 UTC (rev 6291) @@ -31,6 +31,7 @@ endif lookup = __lookup_compat__; # FIXME: remove when 3.3.x is required. + merge = __merge_compat__; # FIXME: remove when 3.3.x is required. if (ischar (key)) i = lookup (d.keys, key, "m"); Added: trunk/octave-forge/main/general/inst/@dict/join.m =================================================================== --- trunk/octave-forge/main/general/inst/@dict/join.m (rev 0) +++ trunk/octave-forge/main/general/inst/@dict/join.m 2009-10-02 09:46:32 UTC (rev 6291) @@ -0,0 +1,51 @@ +## Copyright (C) 2009 VZLU Prague, a.s., Czech Republic +## +## Author: Jaroslav Hajek <hi...@gm...> +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 3 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; see the file COPYING. If not, see +## <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn{Function File} {} join (d1, d2, joinop) +## Merges two given dictionaries. For common keys, the function @var{joinop} is +## called to combine the two values. If not supplied, values from d2 are taken. +## @end deftypefn + +function d = join (d1, d2, jop) + if (nargin < 2 || nargin > 3 || ! (isa (d1, "dict") && isa (d2, "dict"))) + print_usage (); + endif + + keys1 = d1.keys; + keys2 = d2.keys; + + [keys, idx] = sort ([keys1; keys2]); + values = [d1.values(:); d2.values(:)](idx); + n = numel (keys); + + if (n > 1) + idx = find (strcmp (keys(1:n-1), keys(2:n))); + keys(idx) = []; + if (nargin == 3) + values(idx+1) = cellfun (jop, values(idx), values(idx+1), "UniformOutput", false); + endif + values(idx) = []; + endif + + d = dict; + d.keys = keys; + d.values = values; + +endfunction + Modified: trunk/octave-forge/main/general/inst/__lookup_compat__.m =================================================================== --- trunk/octave-forge/main/general/inst/__lookup_compat__.m 2009-10-02 09:27:39 UTC (rev 6290) +++ trunk/octave-forge/main/general/inst/__lookup_compat__.m 2009-10-02 09:46:32 UTC (rev 6291) @@ -19,7 +19,7 @@ ## This replaces the missing functionality of "lookup" if on Octave 3.2. function lookup_func = __lookup_compat__ () - persistent octave32 = issorted ({version, "3.3.x"}); + persistent octave32 = issorted ({"3.0.0", version, "3.3.0"}); if (octave32) lookup_func = @__my_lookup__; else Added: trunk/octave-forge/main/general/inst/__merge_compat__.m =================================================================== --- trunk/octave-forge/main/general/inst/__merge_compat__.m (rev 0) +++ trunk/octave-forge/main/general/inst/__merge_compat__.m 2009-10-02 09:46:32 UTC (rev 6291) @@ -0,0 +1,48 @@ +## Copyright (C) 2009 VZLU Prague, a.s., Czech Republic +## +## Author: Jaroslav Hajek <hi...@gm...> +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 3 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; see the file COPYING. If not, see +## <http://www.gnu.org/licenses/>. + +## This replaces the missing functionality of "merge" if on Octave 3.2. + +function merge_func = __merge_compat__ () + persistent octave32 = issorted ({"3.0.0", version, "3.3.0"}); + if (octave32) + merge_func = @__my_merge__; + else + merge_func = @merge; + endif +endfunction + +function ret = __my_merge__ (mask, tval, fval) + + if (isscalar (mask)) + if (mask) + ret = tval; + else + ret = fval; + endif + else + if (numel (fval) == 1) + ret = repmat (fval, size (mask)); + else + ret = fval; + endif + ret(mask) = tval(mask); + endif +endfunction + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |