#include <iostream>
#include <ctime>
using namespace std;

enum class ECursor : unsigned {
  Auto,
  Cross,
  Default,
  Pointer,
  Move,
  VerticalText,
  Cell,
  ContextMenu,
  Alias,
  Progress,
  NoDrop,
  NotAllowed,
  ZoomIn,
  ZoomOut,
  EResize,
  NeResize,
  NwResize,
  NResize,
  SeResize,
  SwResize,
  SResize,
  WResize,
  EwResize,
  NsResize,
  NeswResize,
  NwseResize,
  ColResize,
  RowResize,
  Text,
  Wait,
  Help,
  AllScroll,
  WebkitGrab,
  WebkitGrabbing,
  Copy,
  None
};

enum CSSValueID {
    CSSValueInvalid = 0,
    CSSValueInherit = 1,
    CSSValueInitial = 2,
    CSSValueNone = 3,
    CSSValueCopy = 148,
    CSSValueSourceOver = 149,
    CSSValueSourceIn = 150,
    CSSValueSourceOut = 151,
    CSSValueSourceAtop = 152,
    CSSValueDestinationOver = 153,
    CSSValueDestinationIn = 154,
    CSSValueDestinationOut = 155,
    CSSValueDestinationAtop = 156,
    CSSValueXor = 157,
    CSSValuePlusLighter = 158,
    CSSValueBaseline = 159,
    CSSValueMiddle = 160,
    CSSValueSub = 161,
    CSSValueSuper = 162,
    CSSValueTextTop = 163,
    CSSValueTextBottom = 164,
    CSSValueTop = 165,
    CSSValueBottom = 166,
    CSSValueWebkitBaselineMiddle = 167,
    CSSValueWebkitAuto = 168,
    CSSValueLeft = 169,
    CSSValueRight = 170,
    CSSValueCenter = 171,
    CSSValueJustify = 172,
    CSSValueWebkitLeft = 173,
    CSSValueWebkitRight = 174,
    CSSValueWebkitCenter = 175,
    CSSValueWebkitMatchParent = 176,
    CSSValueInternalCenter = 177,
    CSSValueInterWord = 178,
    CSSValueDistribute = 179,
    CSSValueOutside = 180,
    CSSValueInside = 181,
    CSSValueDisc = 182,
    CSSValueCircle = 183,
    CSSValueSquare = 184,
    CSSValueDecimal = 185,
    CSSValueDecimalLeadingZero = 186,
    CSSValueArabicIndic = 187,
    CSSValueBengali = 188,
    CSSValueCambodian = 189,
    CSSValueKhmer = 190,
    CSSValueDevanagari = 191,
    CSSValueGujarati = 192,
    CSSValueGurmukhi = 193,
    CSSValueKannada = 194,
    CSSValueLao = 195,
    CSSValueMalayalam = 196,
    CSSValueMongolian = 197,
    CSSValueMyanmar = 198,
    CSSValueOriya = 199,
    CSSValuePersian = 200,
    CSSValueUrdu = 201,
    CSSValueTelugu = 202,
    CSSValueTibetan = 203,
    CSSValueThai = 204,
    CSSValueLowerRoman = 205,
    CSSValueUpperRoman = 206,
    CSSValueLowerGreek = 207,
    CSSValueLowerAlpha = 208,
    CSSValueLowerLatin = 209,
    CSSValueUpperAlpha = 210,
    CSSValueUpperLatin = 211,
    CSSValueCjkEarthlyBranch = 212,
    CSSValueCjkHeavenlyStem = 213,
    CSSValueEthiopicHalehame = 214,
    CSSValueEthiopicHalehameAm = 215,
    CSSValueEthiopicHalehameTiEr = 216,
    CSSValueEthiopicHalehameTiEt = 217,
    CSSValueHangul = 218,
    CSSValueHangulConsonant = 219,
    CSSValueKoreanHangulFormal = 220,
    CSSValueKoreanHanjaFormal = 221,
    CSSValueKoreanHanjaInformal = 222,
    CSSValueHebrew = 223,
    CSSValueArmenian = 224,
    CSSValueLowerArmenian = 225,
    CSSValueUpperArmenian = 226,
    CSSValueGeorgian = 227,
    CSSValueCjkIdeographic = 228,
    CSSValueSimpChineseFormal = 229,
    CSSValueSimpChineseInformal = 230,
    CSSValueTradChineseFormal = 231,
    CSSValueTradChineseInformal = 232,
    CSSValueHiragana = 233,
    CSSValueKatakana = 234,
    CSSValueHiraganaIroha = 235,
    CSSValueKatakanaIroha = 236,
    CSSValueInline = 237,
    CSSValueBlock = 238,
    CSSValueListItem = 239,
    CSSValueInlineBlock = 240,
    CSSValueTable = 241,
    CSSValueInlineTable = 242,
    CSSValueTableRowGroup = 243,
    CSSValueTableHeaderGroup = 244,
    CSSValueTableFooterGroup = 245,
    CSSValueTableRow = 246,
    CSSValueTableColumnGroup = 247,
    CSSValueTableColumn = 248,
    CSSValueTableCell = 249,
    CSSValueTableCaption = 250,
    CSSValueWebkitBox = 251,
    CSSValueWebkitInlineBox = 252,
    CSSValueFlex = 253,
    CSSValueInlineFlex = 254,
    CSSValueGrid = 255,
    CSSValueInlineGrid = 256,
    CSSValueContents = 257,
    CSSValueWebkitFlex = 258,
    CSSValueWebkitInlineFlex = 259,
    CSSValueAuto = 260,
    CSSValueCrosshair = 261,
    CSSValueDefault = 262,
    CSSValuePointer = 263,
    CSSValueMove = 264,
    CSSValueVerticalText = 265,
    CSSValueCell = 266,
    CSSValueContextMenu = 267,
    CSSValueAlias = 268,
    CSSValueProgress = 269,
    CSSValueNoDrop = 270,
    CSSValueNotAllowed = 271,
    CSSValueZoomIn = 272,
    CSSValueZoomOut = 273,
    CSSValueEResize = 274,
    CSSValueNeResize = 275,
    CSSValueNwResize = 276,
    CSSValueNResize = 277,
    CSSValueSeResize = 278,
    CSSValueSwResize = 279,
    CSSValueSResize = 280,
    CSSValueWResize = 281,
    CSSValueEwResize = 282,
    CSSValueNsResize = 283,
    CSSValueNeswResize = 284,
    CSSValueNwseResize = 285,
    CSSValueColResize = 286,
    CSSValueRowResize = 287,
    CSSValueText = 288,
    CSSValueWait = 289,
    CSSValueHelp = 290,
    CSSValueAllScroll = 291,
    CSSValueWebkitGrab = 292,
    CSSValueWebkitGrabbing = 293,
    CSSValueWebkitZoomIn = 294,
    CSSValueWebkitZoomOut = 295,
};

inline ECursor convertToSwitch(CSSValueID m_valueID) {
  switch (m_valueID) {
    case CSSValueAuto:
      return ECursor::Auto;
    case CSSValueCrosshair:
      return ECursor::Cross;
    case CSSValueDefault:
      return ECursor::Default;
    case CSSValuePointer:
      return ECursor::Pointer;
    case CSSValueMove:
      return ECursor::Move;
    case CSSValueCell:
      return ECursor::Cell;
    case CSSValueVerticalText:
      return ECursor::VerticalText;
    case CSSValueContextMenu:
      return ECursor::ContextMenu;
    case CSSValueAlias:
      return ECursor::Alias;
    case CSSValueCopy:
      return ECursor::Copy;
    case CSSValueNone:
      return ECursor::None;
    case CSSValueProgress:
      return ECursor::Progress;
    case CSSValueNoDrop:
      return ECursor::NoDrop;
    case CSSValueNotAllowed:
      return ECursor::NotAllowed;
    case CSSValueZoomIn:
    case CSSValueWebkitZoomIn:
      return ECursor::ZoomIn;
    case CSSValueZoomOut:
    case CSSValueWebkitZoomOut:
      return ECursor::ZoomOut;
    case CSSValueEResize:
      return ECursor::EResize;
    case CSSValueNeResize:
      return ECursor::NeResize;
    case CSSValueNwResize:
      return ECursor::NwResize;
    case CSSValueNResize:
      return ECursor::NResize;
    case CSSValueSeResize:
      return ECursor::SeResize;
    case CSSValueSwResize:
      return ECursor::SwResize;
    case CSSValueSResize:
      return ECursor::SResize;
    case CSSValueWResize:
      return ECursor::WResize;
    case CSSValueEwResize:
      return ECursor::EwResize;
    case CSSValueNsResize:
      return ECursor::NsResize;
    case CSSValueNeswResize:
      return ECursor::NeswResize;
    case CSSValueNwseResize:
      return ECursor::NwseResize;
    case CSSValueColResize:
      return ECursor::ColResize;
    case CSSValueRowResize:
      return ECursor::RowResize;
    case CSSValueText:
      return ECursor::Text;
    case CSSValueWait:
      return ECursor::Wait;
    case CSSValueHelp:
      return ECursor::Help;
    case CSSValueAllScroll:
      return ECursor::AllScroll;
    case CSSValueWebkitGrab:
      return ECursor::WebkitGrab;
    case CSSValueWebkitGrabbing:
      return ECursor::WebkitGrabbing;
    default:
      //NOTREACHED();
      return ECursor::Auto;
  }
}


inline ECursor convertToCast(CSSValueID m_valueID) {
  switch (m_valueID) {
    case CSSValueCopy:
      return ECursor::Copy;
    case CSSValueWebkitZoomIn:
      return ECursor::ZoomIn;
    case CSSValueWebkitZoomOut:
      return ECursor::ZoomOut;
    case CSSValueNone:
      return ECursor::None;
    default:
      return static_cast<ECursor>(m_valueID - CSSValueAuto);
  }
}

static ECursor result;


int main() {
    clock_t start, end;
    int i;
    const int N_ITERATIONS = 100000000;

    start = clock();
    for (i = 0; i < N_ITERATIONS; i++) {
        result = convertToSwitch(CSSValueAuto);
        result = convertToSwitch(CSSValueCrosshair);
        result = convertToSwitch(CSSValueDefault);
        result = convertToSwitch(CSSValuePointer);
        result = convertToSwitch(CSSValueMove);
        result = convertToSwitch(CSSValueCell);
        result = convertToSwitch(CSSValueVerticalText);
        result = convertToSwitch(CSSValueContextMenu);
        result = convertToSwitch(CSSValueAlias);
        result = convertToSwitch(CSSValueCopy);
        result = convertToSwitch(CSSValueNone);
        result = convertToSwitch(CSSValueProgress);
        result = convertToSwitch(CSSValueNoDrop);
        result = convertToSwitch(CSSValueNotAllowed);
        result = convertToSwitch(CSSValueZoomIn);
        result = convertToSwitch(CSSValueWebkitZoomIn);
        result = convertToSwitch(CSSValueZoomOut);
        result = convertToSwitch(CSSValueWebkitZoomOut);
        result = convertToSwitch(CSSValueEResize);
        result = convertToSwitch(CSSValueNeResize);
        result = convertToSwitch(CSSValueNwResize);
        result = convertToSwitch(CSSValueNResize);
        result = convertToSwitch(CSSValueSeResize);
        result = convertToSwitch(CSSValueSwResize);
        result = convertToSwitch(CSSValueSResize);
        result = convertToSwitch(CSSValueWResize);
        result = convertToSwitch(CSSValueEwResize);
        result = convertToSwitch(CSSValueNsResize);
        result = convertToSwitch(CSSValueNeswResize);
        result = convertToSwitch(CSSValueNwseResize);
        result = convertToSwitch(CSSValueColResize);
        result = convertToSwitch(CSSValueRowResize);
        result = convertToSwitch(CSSValueText);
        result = convertToSwitch(CSSValueWait);
        result = convertToSwitch(CSSValueHelp);
        result = convertToSwitch(CSSValueAllScroll);
        result = convertToSwitch(CSSValueWebkitGrab);
        result = convertToSwitch(CSSValueWebkitGrabbing);
    }
    end = clock();
    cout << "Time (switch): " << (end - start) / (double)(CLOCKS_PER_SEC / 1000) << " ms" << endl;


    start = clock();
    for (i = 0; i < N_ITERATIONS; i++) {
        result = convertToCast(CSSValueAuto);
        result = convertToCast(CSSValueCrosshair);
        result = convertToCast(CSSValueDefault);
        result = convertToCast(CSSValuePointer);
        result = convertToCast(CSSValueMove);
        result = convertToCast(CSSValueCell);
        result = convertToCast(CSSValueVerticalText);
        result = convertToCast(CSSValueContextMenu);
        result = convertToCast(CSSValueAlias);
        result = convertToCast(CSSValueCopy);
        result = convertToCast(CSSValueNone);
        result = convertToCast(CSSValueProgress);
        result = convertToCast(CSSValueNoDrop);
        result = convertToCast(CSSValueNotAllowed);
        result = convertToCast(CSSValueZoomIn);
        result = convertToCast(CSSValueWebkitZoomIn);
        result = convertToCast(CSSValueZoomOut);
        result = convertToCast(CSSValueWebkitZoomOut);
        result = convertToCast(CSSValueEResize);
        result = convertToCast(CSSValueNeResize);
        result = convertToCast(CSSValueNwResize);
        result = convertToCast(CSSValueNResize);
        result = convertToCast(CSSValueSeResize);
        result = convertToCast(CSSValueSwResize);
        result = convertToCast(CSSValueSResize);
        result = convertToCast(CSSValueWResize);
        result = convertToCast(CSSValueEwResize);
        result = convertToCast(CSSValueNsResize);
        result = convertToCast(CSSValueNeswResize);
        result = convertToCast(CSSValueNwseResize);
        result = convertToCast(CSSValueColResize);
        result = convertToCast(CSSValueRowResize);
        result = convertToCast(CSSValueText);
        result = convertToCast(CSSValueWait);
        result = convertToCast(CSSValueHelp);
        result = convertToCast(CSSValueAllScroll);
        result = convertToCast(CSSValueWebkitGrab);
        result = convertToCast(CSSValueWebkitGrabbing);
    }
    end = clock();
    cout << "Time (cast): " << (end - start) / (double)(CLOCKS_PER_SEC / 1000) << " ms" << endl;

    cout << static_cast<unsigned>(result) << endl;


    return 0;
}
