View Javadoc

1   ////////////////////////////////////////////////////////////////////////////////
2   // MillScript: an Open Spice interpreter and batch website creation tool
3   // Copyright (C) 2001-2004 Open World Ltd
4   //
5   // This file is part of MillScript.
6   //
7   // MillScript is free software; you can redistribute it and/or modify it under
8   // the terms of the GNU General Public License as published by the Free
9   // Software Foundation; either version 2 of the License, or (at your option)
10  // any later version.
11  //
12  // MillScript is distributed in the hope that it will be useful, but WITHOUT
13  // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14  // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
15  // more details.
16  //
17  // You should have received a copy of the GNU General Public License along with
18  // MillScript; if not, write to the Free Software Foundation, Inc., 59 Temple
19  // Place, Suite 330, Boston, MA  02111-1307  USA
20  ////////////////////////////////////////////////////////////////////////////////
21  package org.millscript.millscript.action;
22  
23  import org.millscript.commons.util.MapIterator;
24  import org.millscript.millscript.datatypes.MapAwareTools;
25  import org.millscript.millscript.expr.Ident;
26  import org.millscript.millscript.vm.Machine;
27  import org.millscript.millscript.vm.Ref;
28  
29  /**
30   * @author moya
31   */
32  /**
33   * This class represents a for loop map binding action. A map binding action
34   * binds successive key-value pairs from a map to given Idents.
35   */
36  public final class BindingMapAction extends BindingInAction {
37  
38      /**
39       * The Ref to bind successive keys to.
40       */
41      Ref kref;
42  
43      /**
44       * The Ref to bind successive values to.
45       */
46      Ref vref;
47  
48      /**
49       * Constructs a new map binding action, with the supplied key and value
50       * Idents and object generating action.
51       *
52       * @param   k   Ident to bind keys to
53       * @param   v   Ident to bind values to
54       * @param   b   Action which generates a map-viewable object to iterate over
55       */
56      public BindingMapAction( final Ident k, final Ident v, final Action b ) {
57          super( b );
58          kref = k.getRef();
59          vref = v.getRef();
60      }
61  
62      /**
63       * @see org.millscript.millscript.action.ForConditionAction#getForIterator(org.millscript.millscript.vm.Machine)
64       */
65      @Override ForIterator getForIterator( final Machine mc ) {
66          return new ForIterator() {
67              private final MapIterator it = MapAwareTools.mapIterator( inAct.act1( mc ) );
68              @Override
69              public void bindAction( final Machine mc2 ) {
70                  // Save the original values of the references we are using
71                  mc2.saveRef( kref );
72                  mc2.saveRef( vref );
73                  // Set the references to the next values
74                  kref.value = it.nextKey();
75                  vref.value = it.currentValue();
76              }
77              @Override
78              public boolean hasNext() {
79                  return it.hasNext();
80              }
81          };
82      }
83  
84  }