263 lines
5.8 KiB
C++

//----------------------------------------------------------------------------
//
// Copyright (C) 2003 Intel Corporation
//
// File: CimDateTime.h
//
// Contents: Classes for working with times and intervals, definitions.
//
//----------------------------------------------------------------------------
#ifndef CIMDATETIME_H
#define CIMDATETIME_H 1
#include <string>
#include <sstream>
#include <memory>
#include "CimUtils.h"
namespace Intel
{
namespace Manageability
{
namespace Cim
{
using std::string;
using std::shared_ptr;
using Untyped::CimSerializer;
class CIMUNTYPEDFRAMEWORK_API CimDateTimeBase
{
public:
// Destructor.
virtual ~CimDateTimeBase() {}
// Properties
virtual void DateTimeString(const string &value) = 0;
virtual string DateTimeString() const = 0;
protected:
// Functions
static bool IsValid(const string& date_time);
template <typename T>
static void SetField(const string& value, T& field)
{
std::istringstream stream(value);
if (value.find_first_not_of('*') != string::npos)
{
stream >> field;
}
else
{
field = -1;
}
if (stream.fail())
{
throw std::invalid_argument("String is not a valid DateTime");
}
}
};
class CIMUNTYPEDFRAMEWORK_API CimDateTimeInterval : public CimDateTimeBase
{
public:
// Ctors / Dtors
explicit CimDateTimeInterval(long days = -1, short hours = -1, short minutes = -1,
short seconds = -1, long microseconds = -1) :
CimDateTimeBase(), _days(days), _hours(hours), _minutes(minutes), _seconds(seconds), _microseconds(microseconds)
{
Validate();
}
explicit CimDateTimeInterval(const string &interval_string);
// Properties
void Days(long days);
const long Days() const { return _days; }
void Hours(short hours);
const short Hours() const { return _hours; }
void Minutes(short minutes);
const short Minutes() const { return _minutes; }
void Seconds(short seconds);
const short Seconds() const { return _seconds; }
void Microseconds(long microseconds);
const long Microseconds() const { return _microseconds; }
virtual void DateTimeString(const string &value);
virtual string DateTimeString() const;
private:
// Data
long _days;
short _hours;
short _minutes;
short _seconds;
long _microseconds;
// Functions
void Validate() const;
};
class CIMUNTYPEDFRAMEWORK_API CimDateTimeAbsolute : public CimDateTimeBase
{
public:
// Ctors / Dtors
explicit CimDateTimeAbsolute(short year = -1, short month = -1, short day = -1,
short hour = -1, short minute = -1, short second = -1, long microsecond = -1,
short utc_offset = 0) :
CimDateTimeBase(), _year(year), _month(month), _day(day),
_hour(hour), _minute(minute), _second(second), _microsecond(microsecond), _utc_offset(utc_offset)
{
Validate();
}
explicit CimDateTimeAbsolute(const string &date_time);
// Properties
void Year(short year);
const short Year() const { return _year; }
void Month(short month);
const short Month() const { return _month; }
void Day(short day);
const short Day() const { return _day; }
void Hour(short hour);
const short Hour() const { return _hour; }
void Minute(short minute);
const short Minute() const { return _minute; }
void Second(short second);
const short Second() const { return _second; }
void Microsecond(long microsecond);
const long Microsecond() const { return _microsecond; }
void UtcOffset(short utc_offset) { _utc_offset = utc_offset; }
const short UtcOffset() const { return _utc_offset; }
virtual void DateTimeString(const string &value);
virtual string DateTimeString() const;
private:
// Data
short _year;
short _month;
short _day;
short _hour;
short _minute;
short _second;
long _microsecond;
short _utc_offset;
// Functions
void Validate() const;
};
class CIMUNTYPEDFRAMEWORK_API CimDateTime
{
public:
enum DateTimeType
{
DT_INTERVAL,
DT_ABSOLUTE,
DT_UNKNOWN
};
// Ctors / Dtors
CimDateTime() : _type(DT_UNKNOWN) {}
CimDateTime(const CimDateTimeAbsolute& date_time) : _type(DT_ABSOLUTE), _pImpl(new CimDateTimeAbsolute(date_time)) {}
CimDateTime(const CimDateTimeInterval& date_time) : _type(DT_INTERVAL), _pImpl(new CimDateTimeInterval(date_time)) {}
CimDateTime(const CimDateTime& other) : _type(other._type), _pImpl(Init_pImpl(other._pImpl)) {}
virtual ~CimDateTime() {}
// Operators
// operator= param passed by value for swapping.
CimDateTime& operator=(CimDateTime other);
// Properties
DateTimeType Type() const { return _type; }
string DateTimeString() const;
void DateTimeString(const string &value);
// Functions
void swap(CimDateTime& other);
const CimDateTimeInterval& AsInterval() const;
CimDateTimeInterval& AsInterval();
const CimDateTimeAbsolute& AsAbsolute() const;
CimDateTimeAbsolute& AsAbsolute();
// Serialization functions
string Serialize() const;
void Deserialize(const string &str);
private:
// Data
DateTimeType _type;
shared_ptr<CimDateTimeBase> _pImpl;
// Functions
CimDateTimeBase* Init_pImpl(shared_ptr<CimDateTimeBase> other) const;
// Type conversion member function templates for internal _pImpl casts
template<typename T>
const T& AsType() const
{
return dynamic_cast<const T&>(*_pImpl);
}
};
void swap(CimDateTime& a, CimDateTime& b);
}
}
}
namespace std
{
template<>
void swap(Intel::Manageability::Cim::CimDateTime& a, Intel::Manageability::Cim::CimDateTime& b);
}
#endif // CIMDATETIME_H