/* Copyright 2017 - 2022 R. Thomas
 * Copyright 2017 - 2022 Quarkslab
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef LIEF_ART_ENUMS_H_
#define LIEF_ART_ENUMS_H_

namespace LIEF {
namespace ART {

enum STORAGE_MODES {
  STORAGE_UNCOMPRESSED = 0,
  STORAGE_LZ4          = 1,
  STORAGE_LZ4HC        = 2,
};

namespace ART_17 {

enum IMAGE_METHODS {
  RESOLUTION_METHOD         = 0,
  IMT_CONFLICT_METHOD       = 1,
  IMT_UNIMPLEMENTED_METHOD  = 2,
  CALLEE_SAVE_METHOD        = 3,
  REFS_ONLY_SAVE_METHOD     = 4,
  REFS_AND_ARGS_SAVE_METHOD = 5,
};

enum IMAGE_SECTIONS {
  SECTION_OBJECTS           = 0,
  SECTION_ART_FIELDS        = 1,
  SECTION_ART_METHODS       = 2,
  SECTION_INTERNED_STRINGS  = 3,
  SECTION_IMAGE_BITMAP      = 4,
};

enum IMAGE_ROOTS {
  DEX_CACHES   = 0,
  CLASS_ROOTS  = 1,
};


} // Namespace ART_17


namespace ART_29 {

using ART_17::IMAGE_METHODS;
using ART_17::IMAGE_ROOTS;

enum IMAGE_SECTIONS {
  SECTION_OBJECTS              = 0,
  SECTION_ART_FIELDS           = 1,
  SECTION_ART_METHODS          = 2,
  SECTION_RUNTIME_METHODS      = 3, // New in ART 29
  SECTION_IMT_CONFLICT_TABLES  = 4, // New in ART 29
  SECTION_DEX_CACHE_ARRAYS     = 5, // New in ART 29
  SECTION_INTERNED_STRINGS     = 6,
  SECTION_CLASS_TABLE          = 7, // New in ART 29
  SECTION_IMAGE_BITMAP         = 8,
};



} // Namespace ART_29


namespace ART_30 {

using ART_29::IMAGE_METHODS;
using ART_29::IMAGE_ROOTS;

enum IMAGE_SECTIONS {
  SECTION_OBJECTS              = 0,
  SECTION_ART_FIELDS           = 1,
  SECTION_ART_METHODS          = 2,
  SECTION_RUNTIME_METHODS      = 3,
  SECTION_IM_TABLES            = 4, // New in ART 30
  SECTION_IMT_CONFLICT_TABLES  = 5,
  SECTION_DEX_CACHE_ARRAYS     = 6,
  SECTION_INTERNED_STRINGS     = 7,
  SECTION_CLASS_TABLE          = 8,
  SECTION_IMAGE_BITMAP         = 9,
};

} // Namespace ART_30

namespace ART_44 {

using ART_30::IMAGE_SECTIONS;

enum IMAGE_METHODS {
  RESOLUTION_METHOD            = 0,
  IMT_CONFLICT_METHOD          = 1,
  IMT_UNIMPLEMENTED_METHOD     = 2,
  SAVE_ALL_CALLEE_SAVES_METHOD = 3, // New in ART 44
  SAVE_REFS_ONLY_METHOD        = 4, // New in ART 44
  SAVE_REFS_AND_ARGS_METHOD    = 5, // New in ART 44
  SAVE_EVERYTHING_METHOD       = 6, // New in ART 44
};


enum IMAGE_ROOTS {
  DEX_CACHES   = 0,
  CLASS_ROOTS  = 1,
  CLASS_LOADER = 2, // New in ART 44
};

} // Namespace ART_44


namespace ART_46 {

using ART_30::IMAGE_SECTIONS;
using ART_30::IMAGE_METHODS;
using ART_30::IMAGE_ROOTS;


} // Namespace ART_46

}
}
#endif
