/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
/*
 * Copyright (c) 2013 University of California, Los Angeles
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation;
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
 */

#ifndef MEM_USAGE_H
#define MEM_USAGE_H

// #ifdef __linux__
// #include <proc/readproc.h>
// #include <unistd.h>
// // #include <sys/resource.h>
// #endif
#ifdef __APPLE__
#include <mach/task.h>
#include <mach/mach_traps.h>
#include <mach/mach.h>
#include <unistd.h>
#include <err.h>
#include <sys/param.h>
#include <mach-o/ldsyms.h>
#endif

/**
 * @brief Utility class to evaluate current usage of RAM
 */
class MemUsage
{
public:
  /**
   * @brief Get memory utilization in bytes
   */
  static inline
  int64_t
  Get ()
  {
// #ifdef __linux__
//     struct proc_t usage;
//     look_up_our_self(&usage);
//     return usage.rss * getpagesize ();
//     //  struct rusage usage;
//     //
//     //  int ret = getrusage (RUSAGE_SELF, &usage);
//     //  if (ret < 0)
//     //    {
//     //      os << "NA";
//     //      return os;
//     //    }
//     //
//     //  os << (usage.ru_ixrss + usage.ru_idrss + usage.ru_isrss);
//     //  return os;
// #endif
#ifdef __APPLE__
    struct task_basic_info t_info;
    mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;

    if (KERN_SUCCESS != task_info (mach_task_self (),
                                   TASK_BASIC_INFO, (task_info_t)&t_info, &t_info_count))
      {
        return -1; // something is wrong
      }

    return t_info.resident_size;
#endif
    // other systems are not yet supported
    return -1;
  }
};

#endif // MEM_USAGE_H
