content: /*
   * [The "BSD licence"]
   * Copyright (c) 2010 Ben Gruver (JesusFreke)
   * All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in the
   *    documentation and/or other materials provided with the distribution.
   * 3. The name of the author may not be used to endorse or promote products
   *    derived from this software without specific prior written permission.
   *
   * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
   * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   */
  
  package org.jf.dexlib;
  
  import java.util.TreeMap;
  
  /**
   * Enumeration of all the top-level item types.
   */
  public enum ItemType {
      TYPE_HEADER_ITEM(               0x0000, 17, 4, "header_item"),
      TYPE_STRING_ID_ITEM(            0x0001, 0,  4, "string_id_item"),
      TYPE_TYPE_ID_ITEM(              0x0002, 1,  4, "type_id_item"),
      TYPE_PROTO_ID_ITEM(             0x0003, 2,  4, "proto_id_item"),
      TYPE_FIELD_ID_ITEM(             0x0004, 3,  4, "field_id_item"),
      TYPE_METHOD_ID_ITEM(            0x0005, 4,  4, "method_id_item"),
      TYPE_CLASS_DEF_ITEM(            0x0006, 5,  4, "class_def_item"),
      TYPE_MAP_LIST(                  0x1000, 16, 4, "map_list"),
      TYPE_TYPE_LIST(                 0x1001, 6,  4, "type_list"),
      TYPE_ANNOTATION_SET_REF_LIST(   0x1002, 7,  4, "annotation_set_ref_list"),
      TYPE_ANNOTATION_SET_ITEM(       0x1003, 8,  4, "annotation_set_item"),
      TYPE_CLASS_DATA_ITEM(           0x2000, 9,  1, "class_data_item"),
      TYPE_CODE_ITEM(                 0x2001, 10, 4, "code_item"),
      TYPE_STRING_DATA_ITEM(          0x2002, 11, 1, "string_data_item"),
      TYPE_DEBUG_INFO_ITEM(           0x2003, 12, 1, "debug_info_item"),
      TYPE_ANNOTATION_ITEM(           0x2004, 13, 1, "annotation_item"),
      TYPE_ENCODED_ARRAY_ITEM(        0x2005, 14, 1, "encoded_array_item"),
      TYPE_ANNOTATIONS_DIRECTORY_ITEM(0x2006, 15, 4, "annotations_directory_item");
  
      /** A map to facilitate looking up an <code>ItemType</code> by ordinal */
      private final static TreeMap<Integer, ItemType> itemTypeIntegerMap;
  
      /** builds the <code>itemTypeIntegerMap</code> object */
      static {
  	    itemTypeIntegerMap = new TreeMap<Integer, ItemType>();
  
          for (ItemType itemType: ItemType.values()) {
              itemTypeIntegerMap.put(itemType.MapValue, itemType);
          }
      }
  
      
  
      /**
       * value when represented in a MapItem
       */
      public final int MapValue;
  
      /**
       * name of the type
       */
      public final String TypeName;
  
      /**
       * index for this item's section
       */
      public final int SectionIndex;
  
      /**
       * the alignment for this item type
       */
      public final int ItemAlignment;
      /**
       * Constructs an instance.
       *
       * @param mapValue value when represented in a MapItem
       * @param sectionIndex index for this item's section
       * @param itemAlignment the byte alignment required by this item 
       * @param typeName non-null; name of the type
       */
      private ItemType(int mapValue, int sectionIndex, int itemAlignment, String typeName) {
          this.MapValue = mapValue;
          this.SectionIndex = sectionIndex;
          this.ItemAlignment = itemAlignment;
          this.TypeName = typeName;
      }
  
      /**
       * Converts an int value to the corresponding ItemType enum value,
       * or null if the value isn't a valid ItemType value
       *
       * @param itemType the int value to convert to an ItemType
       * @return the ItemType enum value corresponding to itemType, or null
       * if not a valid ItemType value
       */
      public static ItemType fromInt(int itemType) {
          return itemTypeIntegerMap.get(itemType);
      }
  
      /**
       * Returns true if this is an indexed item, or false if its an offsetted item
       * @return true if this is an indexed item, or false if its an offsetted item
       */
      public boolean isIndexedItem() {
          return MapValue <= 0x1000;
      }
  }