primitive.h revision 761600567d73b23324ae0251e871c15d6849ffd8
16b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom/*
26b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom * Copyright (C) 2011 The Android Open Source Project
36b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom *
46b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom * Licensed under the Apache License, Version 2.0 (the "License");
56b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom * you may not use this file except in compliance with the License.
66b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom * You may obtain a copy of the License at
76b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom *
86b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom *      http://www.apache.org/licenses/LICENSE-2.0
96b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom *
106b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom * Unless required by applicable law or agreed to in writing, software
116b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom * distributed under the License is distributed on an "AS IS" BASIS,
126b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom * See the License for the specific language governing permissions and
146b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom * limitations under the License.
156b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom */
166b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom
176b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom#ifndef ART_SRC_PRIMITIVE_H_
186b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom#define ART_SRC_PRIMITIVE_H_
196b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom
206b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom#include <sys/types.h>
216b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom
22761600567d73b23324ae0251e871c15d6849ffd8Elliott Hughes#include "base/macros.h"
236b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom#include "logging.h"
246b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom
256b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstromnamespace art {
266b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom
276b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstromclass Object;
286b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom
296b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstromclass Primitive {
306b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom public:
316b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom  enum Type {
326b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom    kPrimNot = 0,
336b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom    kPrimBoolean,
346b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom    kPrimByte,
356b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom    kPrimChar,
366b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom    kPrimShort,
376b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom    kPrimInt,
386b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom    kPrimLong,
396b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom    kPrimFloat,
406b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom    kPrimDouble,
416b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom    kPrimVoid,
426b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom  };
436b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom
446b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom  static Type GetType(char type) {
456b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom    switch (type) {
466b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      case 'B':
476b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom        return kPrimByte;
486b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      case 'C':
496b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom        return kPrimChar;
506b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      case 'D':
516b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom        return kPrimDouble;
526b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      case 'F':
536b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom        return kPrimFloat;
546b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      case 'I':
556b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom        return kPrimInt;
566b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      case 'J':
576b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom        return kPrimLong;
586b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      case 'S':
596b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom        return kPrimShort;
606b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      case 'Z':
616b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom        return kPrimBoolean;
626b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      case 'V':
636b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom        return kPrimVoid;
646b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      default:
656b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom        return kPrimNot;
666b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom    }
676b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom  }
686b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom
696b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom  static size_t ComponentSize(Type type) {
706b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom    switch (type) {
71169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers      case kPrimVoid:    return 0;
726b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      case kPrimBoolean:
736b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      case kPrimByte:    return 1;
746b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      case kPrimChar:
756b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      case kPrimShort:   return 2;
766b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      case kPrimInt:
776b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      case kPrimFloat:   return 4;
786b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      case kPrimLong:
796b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      case kPrimDouble:  return 8;
806b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      case kPrimNot:     return sizeof(Object*);
816b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      default:
826b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom        LOG(FATAL) << "Invalid type " << static_cast<int>(type);
836b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom        return 0;
846b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom    }
856b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom  }
866b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom
876b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom  static size_t FieldSize(Type type) {
886b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom    return ComponentSize(type) <= 4 ? 4 : 8;
896b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom  }
906b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom
9191250e0c3fb0ad758b9b97042a3fa86d5ae76763Elliott Hughes  static const char* Descriptor(Type type) {
926b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom    switch (type) {
936b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      case kPrimBoolean:
9491250e0c3fb0ad758b9b97042a3fa86d5ae76763Elliott Hughes        return "Z";
956b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      case kPrimByte:
9691250e0c3fb0ad758b9b97042a3fa86d5ae76763Elliott Hughes        return "B";
976b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      case kPrimChar:
9891250e0c3fb0ad758b9b97042a3fa86d5ae76763Elliott Hughes        return "C";
996b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      case kPrimShort:
10091250e0c3fb0ad758b9b97042a3fa86d5ae76763Elliott Hughes        return "S";
1016b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      case kPrimInt:
10291250e0c3fb0ad758b9b97042a3fa86d5ae76763Elliott Hughes        return "I";
1036b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      case kPrimFloat:
10491250e0c3fb0ad758b9b97042a3fa86d5ae76763Elliott Hughes        return "F";
1056b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      case kPrimLong:
10691250e0c3fb0ad758b9b97042a3fa86d5ae76763Elliott Hughes        return "J";
1076b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      case kPrimDouble:
10891250e0c3fb0ad758b9b97042a3fa86d5ae76763Elliott Hughes        return "D";
1096d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers      case kPrimVoid:
11091250e0c3fb0ad758b9b97042a3fa86d5ae76763Elliott Hughes        return "V";
1116b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom      default:
1126b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom        LOG(FATAL) << "Primitive char conversion on invalid type " << static_cast<int>(type);
11391250e0c3fb0ad758b9b97042a3fa86d5ae76763Elliott Hughes        return NULL;
1146b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom    }
1156b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom  }
1166b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom
1176b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom private:
1186b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom  DISALLOW_IMPLICIT_CONSTRUCTORS(Primitive);
1196b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom};
1206b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom
121ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstromstd::ostream& operator<<(std::ostream& os, const Primitive::Type& state);
122ae826983f7903bc0a6bbbe8426bf393fb2f6d747Brian Carlstrom
1236b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom}  // namespace art
1246b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom
1256b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom#endif  // ART_SRC_PRIMITIVE_H_
126