// Copyright (c) 2006- Facebook
// Distributed under the Thrift Software License
//
// See accompanying file LICENSE or visit the Thrift site at:
// http://developers.facebook.com/thrift/

#ifndef _THRIFT_TREFLECTIONLOCAL_H_
#define _THRIFT_TREFLECTIONLOCAL_H_ 1

#include <stdint.h>
#include <protocol/TProtocol.h>

namespace facebook { namespace thrift { namespace reflection { namespace local {

using facebook::thrift::protocol::TType;

/**
 * A local reflection is a representation of a Thrift structure.
 * (It is called local because it cannot be serialized by Thrift).
 *
 * @author David Reiss <dreiss@facebook.com>
 */

struct FieldMeta {
  int16_t tag;
  bool is_optional;
};

struct TypeSpec {
  // Use an anonymous union here so we can fit two TypeSpecs in one cache line.
  union {
    struct {
      // Use parallel arrays here for denser packing (of the arrays).
      FieldMeta* metas;
      TypeSpec** specs;
      // n_fields is only used for debugging, but it should only add
      // a minimimal amount to the effective size of this structure
      // because of alignment restrictions.
      int        n_fields;
    } tstruct;
    struct {
      TypeSpec *subtype1;
      TypeSpec *subtype2;
    } tcontainer;
  };

  // Put this at the end so the 32-bit enum can be crammed up next to the
  // 32-bit int (n_fields).
  TType ttype;


  // Static initialization of unions isn't really possible,
  // so take the plunge and use constructors.
  // Hopefully they'll be evaluated at compile time.

  TypeSpec(TType ttype) : ttype(ttype) {}

  TypeSpec(TType ttype, int n_fields, FieldMeta* metas, TypeSpec** specs) :
    ttype(ttype)
  {
    tstruct.n_fields = n_fields;
    tstruct.metas = metas;
    tstruct.specs = specs;
  }

  TypeSpec(TType ttype, TypeSpec* subtype1, TypeSpec* subtype2) :
    ttype(ttype)
  {
    tcontainer.subtype1 = subtype1;
    tcontainer.subtype2 = subtype2;
  }

};

}}}} // facebook::thrift::reflection::local

#endif // #ifndef _THRIFT_TREFLECTIONLOCAL_H_
