<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Definitions SYSTEM "widlprocxml.dtd">
<Definitions>
  <webidl>interface OrderedMap {
  readonly attribute unsigned long size;

  getter any getByIndex(unsigned long index);
  setter void setByIndex(unsigned long index, any value);
  deleter void removeByIndex(unsigned long index);

  getter any get(DOMString name);
  setter creator void set(DOMString name, any value);
  deleter void remove(DOMString name);
};</webidl>
  <Interface name="OrderedMap" id="::OrderedMap">
    <webidl>interface OrderedMap {
  readonly attribute unsigned long size;

  getter any getByIndex(unsigned long index);
  setter void setByIndex(unsigned long index, any value);
  deleter void removeByIndex(unsigned long index);

  getter any get(DOMString name);
  setter creator void set(DOMString name, any value);
  deleter void remove(DOMString name);
};</webidl>
    <Attribute readonly="readonly" name="size" id="::OrderedMap::size">
      <webidl>  readonly attribute unsigned long size;</webidl>
      <Type type="unsigned long"/>
    </Attribute>
    <Operation getter="getter" name="getByIndex" id="::OrderedMap::getByIndex">
      <webidl>  getter any getByIndex(unsigned long index);</webidl>
      <Type type="any"/>
      <ArgumentList>
        <Argument name="index">
          <Type type="unsigned long"/>
        </Argument>
      </ArgumentList>
    </Operation>
    <Operation setter="setter" name="setByIndex" id="::OrderedMap::setByIndex">
      <webidl>  setter void setByIndex(unsigned long index, any value);</webidl>
      <Type type="void"/>
      <ArgumentList>
        <Argument name="index">
          <Type type="unsigned long"/>
        </Argument>
        <Argument name="value">
          <Type type="any"/>
        </Argument>
      </ArgumentList>
    </Operation>
    <Operation deleter="deleter" name="removeByIndex" id="::OrderedMap::removeByIndex">
      <webidl>  deleter void removeByIndex(unsigned long index);</webidl>
      <Type type="void"/>
      <ArgumentList>
        <Argument name="index">
          <Type type="unsigned long"/>
        </Argument>
      </ArgumentList>
    </Operation>
    <Operation getter="getter" name="get" id="::OrderedMap::get">
      <webidl>  getter any get(DOMString name);</webidl>
      <Type type="any"/>
      <ArgumentList>
        <Argument name="name">
          <Type type="DOMString"/>
        </Argument>
      </ArgumentList>
    </Operation>
    <Operation setter="setter" creator="creator" name="set" id="::OrderedMap::set">
      <webidl>  setter creator void set(DOMString name, any value);</webidl>
      <Type type="void"/>
      <ArgumentList>
        <Argument name="name">
          <Type type="DOMString"/>
        </Argument>
        <Argument name="value">
          <Type type="any"/>
        </Argument>
      </ArgumentList>
    </Operation>
    <Operation deleter="deleter" name="remove" id="::OrderedMap::remove">
      <webidl>  deleter void remove(DOMString name);</webidl>
      <Type type="void"/>
      <ArgumentList>
        <Argument name="name">
          <Type type="DOMString"/>
        </Argument>
      </ArgumentList>
    </Operation>
  </Interface>
</Definitions>
