Path: blob/master/thirdparty/embree/common/math/range.h
9912 views
// Copyright 2009-2021 Intel Corporation1// SPDX-License-Identifier: Apache-2.023#pragma once45#include "../sys/platform.h"6#include "../math/emath.h"78namespace embree9{10template<typename Ty>11struct range12{13__forceinline range() {}1415__forceinline range(const Ty& begin)16: _begin(begin), _end(begin+1) {}1718__forceinline range(const Ty& begin, const Ty& end)19: _begin(begin), _end(end) {}2021__forceinline range(const range& other)22: _begin(other._begin), _end(other._end) {}2324template<typename T1>25__forceinline range(const range<T1>& other)26: _begin(Ty(other._begin)), _end(Ty(other._end)) {}2728template<typename T1>29__forceinline range& operator =(const range<T1>& other) {30_begin = other._begin;31_end = other._end;32return *this;33}3435__forceinline Ty begin() const {36return _begin;37}3839__forceinline Ty end() const {40return _end;41}4243__forceinline range intersect(const range& r) const {44return range (max(_begin,r._begin),min(_end,r._end));45}4647__forceinline Ty size() const {48return _end - _begin;49}5051__forceinline bool empty() const {52return _end <= _begin;53}5455__forceinline Ty center() const {56return (_begin + _end)/2;57}5859__forceinline std::pair<range,range> split() const60{61const Ty _center = center();62return std::make_pair(range(_begin,_center),range(_center,_end));63}6465__forceinline void split(range& left_o, range& right_o) const66{67const Ty _center = center();68left_o = range(_begin,_center);69right_o = range(_center,_end);70}7172__forceinline friend bool operator< (const range& r0, const range& r1) {73return r0.size() < r1.size();74}7576friend embree_ostream operator<<(embree_ostream cout, const range& r) {77return cout << "range [" << r.begin() << ", " << r.end() << "]";78}7980Ty _begin, _end;81};8283template<typename Ty>84range<Ty> make_range(const Ty& begin, const Ty& end) {85return range<Ty>(begin,end);86}8788template<typename Ty>89struct extended_range : public range<Ty>90{91__forceinline extended_range () {}9293__forceinline extended_range (const Ty& begin)94: range<Ty>(begin), _ext_end(begin+1) {}9596__forceinline extended_range (const Ty& begin, const Ty& end)97: range<Ty>(begin,end), _ext_end(end) {}9899__forceinline extended_range (const Ty& begin, const Ty& end, const Ty& ext_end)100: range<Ty>(begin,end), _ext_end(ext_end) {}101102__forceinline Ty ext_end() const {103return _ext_end;104}105106__forceinline Ty ext_size() const {107return _ext_end - range<Ty>::_begin;108}109110__forceinline Ty ext_range_size() const {111return _ext_end - range<Ty>::_end;112}113114__forceinline bool has_ext_range() const {115assert(_ext_end >= range<Ty>::_end);116return (_ext_end - range<Ty>::_end) > 0;117}118119__forceinline void set_ext_range(const size_t ext_end){120assert(ext_end >= range<Ty>::_end);121_ext_end = ext_end;122}123124__forceinline void move_right(const size_t plus){125range<Ty>::_begin += plus;126range<Ty>::_end += plus;127_ext_end += plus;128}129130friend embree_ostream operator<<(embree_ostream cout, const extended_range& r) {131return cout << "extended_range [" << r.begin() << ", " << r.end() << " (" << r.ext_end() << ")]";132}133134Ty _ext_end;135};136}137138139