Arquivos
hhvm/hphp/runtime/base/dateinterval.h
T
Kyle Delong a8e3321fbd HPHP/XHP: 'mixed' type in attribute declarations
We'd like to start using ##mixed## instead of ##var## for attribute types to be consistent with Hack. As a followup to this (once released), we would codemod all ##var## to ##mixed##.
2013-07-18 17:28:37 -07:00

128 linhas
4.8 KiB
C++

/*
+----------------------------------------------------------------------+
| HipHop for PHP |
+----------------------------------------------------------------------+
| Copyright (c) 2010-2013 Facebook, Inc. (http://www.facebook.com) |
| Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) |
+----------------------------------------------------------------------+
| This source file is subject to version 2.00 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.zend.com/license/2_00.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
*/
#ifndef incl_HPHP_DATEINTERVAL_H_
#define incl_HPHP_DATEINTERVAL_H_
#include "hphp/runtime/base/types.h"
#include "hphp/runtime/base/complex_types.h"
#include "hphp/runtime/base/resource_data.h"
#include "hphp/runtime/base/smart_object.h"
#include "hphp/util/alloc.h"
extern "C" {
#include <timelib.h>
}
/**
* Older versions of timelib don't support certain
* relative interval functions. Mock them as needed here.
*/
#if defined(TIMELIB_VERSION) && (TIMELIB_VERSION >= 201101)
# define TIMELIB_HAVE_INTERVAL
# define TIMELIB_HAVE_TZLOCATION
# define TIMELIB_REL_INVERT(rel) (rel)->invert
# define TIMELIB_REL_DAYS(rel) (rel)->days
# define TIMELIB_REL_INVERT_SET(rel, val) (rel)->invert = (val)
# define TIMELIB_REL_DAYS_SET(rel, val) (rel)->days = (val)
#else
# define TIMELIB_REL_INVERT(rel) 0
# define TIMELIB_REL_DAYS(rel) -99999
# define TIMELIB_REL_INVERT_SET(rel, val)
# define TIMELIB_REL_DAYS_SET(rel, val)
inline timelib_rel_time* timelib_rel_time_clone(timelib_rel_time* t) {
timelib_rel_time *ret = (timelib_rel_time*)
HPHP::Util::safe_malloc(sizeof(timelib_rel_time));
memcpy(ret, t, sizeof(timelib_rel_time));
return ret;
}
inline void timelib_rel_time_dtor(timelib_rel_time *t) {
HPHP::Util::safe_free(t);
}
#endif /* TIMELIB_HAVE_INTERVAL */
namespace HPHP {
///////////////////////////////////////////////////////////////////////////////
typedef boost::shared_ptr<timelib_rel_time> DateIntervalPtr;
/**
* Handles all date interal related functions.
*/
class DateInterval : public SweepableResourceData {
public:
DECLARE_OBJECT_ALLOCATION(DateInterval);
static StaticString s_class_name;
CStrRef o_getClassNameHook() const { return s_class_name; }
DateInterval();
explicit DateInterval(CStrRef date_interval, bool date_string = false);
explicit DateInterval(timelib_rel_time *di);
int64_t getYears() const { return m_di->y; }
int64_t getMonths() const { return m_di->m; }
int64_t getDays() const { return m_di->d; }
int64_t getHours() const { return m_di->h; }
int64_t getMinutes() const { return m_di->i; }
int64_t getSeconds() const { return m_di->s; }
bool isInverted() const { return TIMELIB_REL_INVERT(m_di); }
bool haveTotalDays() const { return TIMELIB_REL_DAYS(m_di) != -99999; }
int64_t getTotalDays() const { return TIMELIB_REL_DAYS(m_di); }
void setYears(int64_t value) { if (isValid()) m_di->y = value; }
void setMonths(int64_t value) { if (isValid()) m_di->m = value; }
void setDays(int64_t value) { if (isValid()) m_di->d = value; }
void setHours(int64_t value) { if (isValid()) m_di->h = value; }
void setMinutes(int64_t value) { if (isValid()) m_di->i = value; }
void setSeconds(int64_t value) { if (isValid()) m_di->s = value; }
void setInverted(bool value) {
if (isValid()) TIMELIB_REL_INVERT_SET(m_di, value);
}
void setTotalDays(int64_t value) {
if (isValid()) TIMELIB_REL_DAYS_SET(m_di, value);
}
bool setDateString(CStrRef date_string);
bool setInterval(CStrRef date_interval);
String format(CStrRef format_spec);
bool isValid() const { return get(); }
SmartResource<DateInterval> cloneDateInterval() const;
protected:
friend class DateTime;
timelib_rel_time *get() const { return m_di.get(); }
private:
struct dateinterval_deleter {
void operator()(timelib_rel_time *di) {
if (di) {
timelib_rel_time_dtor(di);
}
}
};
DateIntervalPtr m_di;
};
///////////////////////////////////////////////////////////////////////////////
}
#endif // incl_HPHP_DATEINTERVAL_H_