// Filename: memoryInfo.h
// Created by:  drose (04Jun01)
//
////////////////////////////////////////////////////////////////////
//
// PANDA 3D SOFTWARE
// Copyright (c) Carnegie Mellon University.  All rights reserved.
//
// All use of this software is subject to the terms of the revised BSD
// license.  You should have received a copy of this license along
// with this source code in a file named "LICENSE."
//
////////////////////////////////////////////////////////////////////

#ifndef MEMORYINFO_H
#define MEMORYINFO_H

#include "pandabase.h"

#ifdef DO_MEMORY_USAGE

#include "typeHandle.h"

class ReferenceCount;
class TypedObject;

////////////////////////////////////////////////////////////////////
//       Class : MemoryInfo
// Description : This is a supporting class for MemoryUsage.  It
//               records the detailed information for a particular
//               pointer allocated by Panda code.  This record is only
//               kept if track-mem-usage is configured #t.
//
//               It's not exported from the DLL, and it doesn't even
//               exist if we're compiling NDEBUG.
////////////////////////////////////////////////////////////////////
class MemoryInfo {
public:
  MemoryInfo();

public:
  // Members to view the MemoryInfo structure.
  TypeHandle get_type();

  INLINE void *get_void_ptr() const;
  INLINE ReferenceCount *get_ref_ptr() const;
  INLINE TypedObject *get_typed_ptr() const;

  INLINE bool is_size_known() const;
  INLINE size_t get_size() const;

  INLINE double get_time() const;

private:
  // Members to set up the MemoryInfo structure.
  void determine_dynamic_type();
  bool update_type_handle(TypeHandle &destination, TypeHandle refined);

private:
  enum Flags {
    F_size_known              = 0x0001,
    F_reconsider_dynamic_type = 0x0002,
  };
  
  void *_void_ptr;
  ReferenceCount *_ref_ptr;
  TypedObject *_typed_ptr;
  size_t _size;
  TypeHandle _static_type;
  TypeHandle _dynamic_type;
  int _flags;
  
  double _time;
  int _freeze_index;

  friend class MemoryUsage;
};

#include "memoryInfo.I"

#endif  // DO_MEMORY_USAGE

#endif

