111986Sandreas.sandberg@arm.com/*
211986Sandreas.sandberg@arm.com    pybind11/options.h: global settings that are configurable at runtime.
311986Sandreas.sandberg@arm.com
411986Sandreas.sandberg@arm.com    Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>
511986Sandreas.sandberg@arm.com
611986Sandreas.sandberg@arm.com    All rights reserved. Use of this source code is governed by a
711986Sandreas.sandberg@arm.com    BSD-style license that can be found in the LICENSE file.
811986Sandreas.sandberg@arm.com*/
911986Sandreas.sandberg@arm.com
1011986Sandreas.sandberg@arm.com#pragma once
1111986Sandreas.sandberg@arm.com
1212391Sjason@lowepower.com#include "detail/common.h"
1311986Sandreas.sandberg@arm.com
1412391Sjason@lowepower.comNAMESPACE_BEGIN(PYBIND11_NAMESPACE)
1511986Sandreas.sandberg@arm.com
1611986Sandreas.sandberg@arm.comclass options {
1711986Sandreas.sandberg@arm.compublic:
1811986Sandreas.sandberg@arm.com
1911986Sandreas.sandberg@arm.com    // Default RAII constructor, which leaves settings as they currently are.
2011986Sandreas.sandberg@arm.com    options() : previous_state(global_state()) {}
2111986Sandreas.sandberg@arm.com
2211986Sandreas.sandberg@arm.com    // Class is non-copyable.
2311986Sandreas.sandberg@arm.com    options(const options&) = delete;
2411986Sandreas.sandberg@arm.com    options& operator=(const options&) = delete;
2511986Sandreas.sandberg@arm.com
2611986Sandreas.sandberg@arm.com    // Destructor, which restores settings that were in effect before.
2711986Sandreas.sandberg@arm.com    ~options() {
2811986Sandreas.sandberg@arm.com        global_state() = previous_state;
2911986Sandreas.sandberg@arm.com    }
3011986Sandreas.sandberg@arm.com
3111986Sandreas.sandberg@arm.com    // Setter methods (affect the global state):
3211986Sandreas.sandberg@arm.com
3311986Sandreas.sandberg@arm.com    options& disable_user_defined_docstrings() & { global_state().show_user_defined_docstrings = false; return *this; }
3411986Sandreas.sandberg@arm.com
3511986Sandreas.sandberg@arm.com    options& enable_user_defined_docstrings() & { global_state().show_user_defined_docstrings = true; return *this; }
3611986Sandreas.sandberg@arm.com
3711986Sandreas.sandberg@arm.com    options& disable_function_signatures() & { global_state().show_function_signatures = false; return *this; }
3811986Sandreas.sandberg@arm.com
3911986Sandreas.sandberg@arm.com    options& enable_function_signatures() & { global_state().show_function_signatures = true; return *this; }
4011986Sandreas.sandberg@arm.com
4111986Sandreas.sandberg@arm.com    // Getter methods (return the global state):
4211986Sandreas.sandberg@arm.com
4311986Sandreas.sandberg@arm.com    static bool show_user_defined_docstrings() { return global_state().show_user_defined_docstrings; }
4411986Sandreas.sandberg@arm.com
4511986Sandreas.sandberg@arm.com    static bool show_function_signatures() { return global_state().show_function_signatures; }
4611986Sandreas.sandberg@arm.com
4711986Sandreas.sandberg@arm.com    // This type is not meant to be allocated on the heap.
4811986Sandreas.sandberg@arm.com    void* operator new(size_t) = delete;
4911986Sandreas.sandberg@arm.com
5011986Sandreas.sandberg@arm.comprivate:
5111986Sandreas.sandberg@arm.com
5211986Sandreas.sandberg@arm.com    struct state {
5311986Sandreas.sandberg@arm.com        bool show_user_defined_docstrings = true;  //< Include user-supplied texts in docstrings.
5411986Sandreas.sandberg@arm.com        bool show_function_signatures = true;      //< Include auto-generated function signatures in docstrings.
5511986Sandreas.sandberg@arm.com    };
5611986Sandreas.sandberg@arm.com
5711986Sandreas.sandberg@arm.com    static state &global_state() {
5811986Sandreas.sandberg@arm.com        static state instance;
5911986Sandreas.sandberg@arm.com        return instance;
6011986Sandreas.sandberg@arm.com    }
6111986Sandreas.sandberg@arm.com
6211986Sandreas.sandberg@arm.com    state previous_state;
6311986Sandreas.sandberg@arm.com};
6411986Sandreas.sandberg@arm.com
6512391Sjason@lowepower.comNAMESPACE_END(PYBIND11_NAMESPACE)
66