// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#ifndef VM_BITFIELD_H_
#define VM_BITFIELD_H_

namespace dart {

static const uword kUwordOne = 1U;

// BitField is a template for encoding and decoding a value of type T
// inside a storage of type S.
template<typename S, typename T, int position, int size>
class BitField {
 public:
  static const intptr_t kNextBit = position + size;

  // Tells whether the provided value fits into the bit field.
  static bool is_valid(T value) {
    return (static_cast<S>(value) & ~((kUwordOne << size) - 1)) == 0;
  }

  // Returns a S mask of the bit field.
  static S mask() {
    return (kUwordOne << size) - 1;
  }

  // Returns a S mask of the bit field which can be applied directly to
  // to the raw unshifted bits.
  static S mask_in_place() {
    return ((kUwordOne << size) - 1) << position;
  }

  // Returns the shift count needed to right-shift the bit field to
  // the least-significant bits.
  static int shift() {
    return position;
  }

  // Returns the size of the bit field.
  static int bitsize() {
    return size;
  }

  // Returns an S with the bit field value encoded.
  static S encode(T value) {
    COMPILE_ASSERT((sizeof(S) * kBitsPerByte) >= (position + size));
    ASSERT(is_valid(value));
    return static_cast<S>(value) << position;
  }

  // Extracts the bit field from the value.
  static T decode(S value) {
    return static_cast<T>((value >> position) & ((kUwordOne << size) - 1));
  }

  // Returns an S with the bit field value encoded based on the
  // original value. Only the bits corresponding to this bit field
  // will be changed.
  static S update(T value, S original) {
    ASSERT(is_valid(value));
    return (static_cast<S>(value) << position) |
        (~mask_in_place() & original);
  }
};

}  // namespace dart

#endif  // VM_BITFIELD_H_
