wrapping_int.hpp
来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 142 行
HPP
142 行
#ifndef _DATE_TIME_WRAPPING_INT_HPP__#define _DATE_TIME_WRAPPING_INT_HPP__/* Copyright (c) 2002,2003 CrystalClear Software, Inc. * Use, modification and distribution is subject to the * Boost Software License, Version 1.0. (See accompanying * file LICENSE-1.0 or http://www.boost.org/LICENSE-1.0) * Author: Jeff Garland, Bart Garst * $Date: 2004/05/23 10:39:26 $ */namespace boost {namespace date_time {//! A wrapping integer used to support time durations /*! In composite date and time types this type is used to * wrap at the day boundary. * */template<typename int_type_, int_type_ wrap_val>class wrapping_int {public: typedef int_type_ int_type; //typedef overflow_type_ overflow_type; static int_type wrap_value() {return wrap_val;} //!Add, return true if wrapped wrapping_int(int_type v) : value_(v) {}; //! Explicit converion method int_type as_int() const {return value_;} operator int_type() const {return value_;} int_type add(int_type v) { //take the mod here and assign it.... int_type remainder = static_cast<int_type>(v % wrap_val); int_type overflow = static_cast<int_type>(v / wrap_val); value_ = static_cast<int_type>(value_ + remainder); if ((value_) >= wrap_val) { value_ -= wrap_val; overflow++; } return overflow; } int_type subtract(int_type v) { //take the mod here and assign it.... int_type remainder = v % wrap_val; int_type underflow = v / wrap_val; // std::cout << "wi :" << value_ << "|"// << v << "|"// << underflow << "|" // << remainder << "|" // << wrap_val << std::endl; if (remainder > value_) { underflow++; // value_ = remainder - value_; value_ = wrap_val - (remainder-value_); } else { value_ -= remainder; //value_ = wrap_val-(remainder-value_); // value_ = wrap_val -(value_-remainder); }// std::cout << "wi final uf: " << underflow // << " value: " << value_ << std::endl; return underflow; } private: int_type value_; };//! A wrapping integer used to wrap around at the top/*! Bad name, quick impl to fix a bug -- fix later!! * This allows the wrap to restart at a value other than 0. * Currently this only works if wrap_min == 1 */template<typename int_type_, int_type_ wrap_min, int_type_ wrap_max>class wrapping_int2 {public: typedef int_type_ int_type; static unsigned long wrap_value() {return wrap_max;} static unsigned long min_value() {return wrap_min;} /*! If initializing value is out of range of [wrap_min, wrap_max], * value will be initialized to closest of min or max */ wrapping_int2(int_type v) : value_(v) { if(value_ < wrap_min) { value_ = wrap_min; } if(value_ > wrap_max) { value_ = wrap_max; } } //! Explicit converion method int_type as_int() const {return value_;} operator int_type() const {return value_;} //!Add, return number of wraps performed int_type add(int_type v) { int_type remainder = static_cast<int_type>(v % (wrap_max - wrap_min + 1)); int_type overflow = static_cast<int_type>(v / (wrap_max - wrap_min + 1)); value_ = static_cast<int_type>(value_ + remainder); if ((value_) > wrap_max) { overflow++; value_ -= (wrap_max - wrap_min + 1); } return overflow; } //! Subtract will return '-d' if wrapping took place ('d' is the number of wraps) int_type subtract(int_type v) { int_type remainder = static_cast<int_type>(v % (wrap_max - wrap_min + 1)); int_type underflow = static_cast<int_type>(-(v / (wrap_max - wrap_min + 1))); value_ = static_cast<int_type>(value_ - remainder); if ((value_) < wrap_min) { underflow--; value_ += (wrap_max - wrap_min + 1); } return underflow; } private: int_type value_; };} } //namespace date_time#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?