/* -*-c++-*- */ /* osgEarth - Geospatial SDK for OpenSceneGraph * Copyright 2020 Pelican Mapping * http://osgearth.org * * osgEarth is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see */ #pragma once namespace osgEarth { /** * A template for defining "optional" class members. An optional member has a default value * and a flag indicating whether the member is "set". * This is used extensively in osgEarth's Config subsystem. */ template struct optional { optional() { } optional(const optional& rhs) : _set(rhs._set), _value(rhs._value), _defaultValue(rhs._defaultValue) { } optional& operator = (const optional& rhs) { _set=rhs._set; _value=rhs._value; _defaultValue=rhs._defaultValue; return *this; } optional(const T& defaultValue) : _value(defaultValue), _defaultValue(defaultValue) { } const T& operator =(const T& value) { _set=true; _value=value; return _value; } bool operator ==(const optional& rhs) const { return _set && rhs._set && _value==rhs._value; } bool operator !=(const optional& rhs) const { return !( (*this)==rhs); } bool operator ==(const T& value) const { return _value==value; } bool operator !=(const T& value) const { return _value!=value; } bool operator > (const T& value) const { return _value>value; } bool operator >=(const T& value) const { return _value>=value; } bool operator < (const T& value) const { return _value() const { return &_value; } public: // deprecated methods // sets a default value and usets the variable //[[deprecated("Use setDefault or OE_OPTION(type,name,default) instead")]] void init(T defValue) { _value = defValue; _defaultValue = defValue; unset(); } //[[deprecated("Use mutable_value() or edit() instead")]] T* operator ->() { _set = true; return &_value; } private: bool _set = false; T _value; T _defaultValue; typedef T* optional::*unspecified_bool_type; public: operator unspecified_bool_type() const { return 0; } }; }