// ball_loggermanagerdefaults.h -*-C++-*- // ---------------------------------------------------------------------------- // NOTICE // // This component is not up to date with current BDE coding standards, and // should not be used as an example for new development. // ---------------------------------------------------------------------------- #ifndef INCLUDED_BALL_LOGGERMANAGERDEFAULTS #define INCLUDED_BALL_LOGGERMANAGERDEFAULTS #include <bsls_ident.h> BSLS_IDENT("$Id: $") //@PURPOSE: Provide constrained default attributes for the logger manager. // //@CLASSES: // ball::LoggerManagerDefaults: default parameters for logger manager // //@SEE_ALSO: ball_loggermanagerconfiguration // //@DESCRIPTION: This component provides a simply-constrained attribute class, // 'ball::LoggerManagerDefaults', that contains a set of attributes (objects // and parameters) of particular use to logger managers. The constraints are // actively maintained by the class. In particular, the "set" methods for // constrained values will fail if their arguments are not consistent with the // constraints. Also, the constructor does not take any constrained arguments, // but rather sets those values to valid defaults unconditionally. This // behavior avoids "silent failures", since the constructor cannot explicitly // return a status value. // // The attributes contained by a 'ball::LoggerManagerDefaults' object and // the attribute constraints are given, respectively, in two tables below. // The attributes are as follows: //.. // TYPE NAME DESCRIPTION // ----------- ---------------- ------------------------------------- // int recordBufferSize size in bytes of *default* logger's // record buffer // int loggerBufferSize default size in bytes of *each* // logger's "scratch" buffer (for macros) // char recordLevel default record severity level // char passLevel default pass-through severity level // char triggerLevel default trigger severity level // char triggerAllLevel default triggerAll severity level //.. // The constraints are as follows: //.. // NAME CONSTRAINT // +--------------------+---------------------------------------------+ // | recordBufferSize | 1 <= recordBufferSize | // +--------------------+---------------------------------------------+ // | loggerBufferSize | 1 <= loggerBufferSize | // +--------------------+---------------------------------------------+ // | recordLevel | 0 <= recordLevel <= 255 | // | passLevel | 0 <= passLevel <= 255 | // | triggerLevel | 0 <= triggerLevel <= 255 | // | triggerAllLevel | 0 <= triggerAllLevel <= 255 | // +--------------------+---------------------------------------------+ //.. // Although the numerical constraints on the four severity levels are // independent of one another, they are treated as logically coupled, and must // be set as a group. If any one value cannot be successfully set, then the // whole set operation fails with no effect on the object value. This may be // viewed as an auxiliary constraint. // ///Thread Safety ///------------- // This constrained-attribute component is *thread-safe* but not // *thread-enabled*, and requires explicit synchronization in the user space. // ///Design Note ///----------- // This component provides a BDE constrained-attribute type designed to be // *useful* to 'ball::LoggerManager'. However, 'ball::LoggerManagerDefaults' // is not 'ball::LoggerManagerConfiguration', the actual configuration object // used by the logger manager. 'ball::LoggerManagerConfiguration' is not a // value semantic type, because it holds functors. // 'ball::LoggerManagerDefaults', which is used by // 'ball::LoggerManagerConfiguration', may be regarded as a factored detail of // the actual configuration object. // ///Usage ///----- // The following snippets of code illustrate how to use a // 'ball::LoggerManagerDefaults' object. First, create a configuration object // 'lmd'. Note that it is necessarily configured to valid but unpublished // defaults. //.. // ball::LoggerManagerDefaults lmd; //.. // Next, set each attribute. Note that the four severity threshold levels must // be set atomically (i.e., with a single four-argument "set" method). Note // also that each "set" method will fail if the argument or set of arguments is // not valid, and so each method returns a status value. //.. // assert( 0 == lmd.setDefaultRecordBufferSizeIfValid(32768)); // assert(32768 == lmd.defaultRecordBufferSize()); // // assert( 0 == lmd.setDefaultLoggerBufferSizeIfValid(2048)); // assert(2048 == lmd.defaultLoggerBufferSize()); // // assert( 0 == lmd.setDefaultThresholdLevelsIfValid(192, 64, 48, 32)); // assert(192 == lmd.defaultRecordLevel()); // assert( 64 == lmd.defaultPassLevel()); // assert( 48 == lmd.defaultTriggerLevel()); // assert( 32 == lmd.defaultTriggerAllLevel()); //.. // The configuration object is now validly configured with our choice of // parameters. If, however, we attempt to set an invalid configuration, the // "set" method will fail (with a non-zero return status), and the // configuration will be left unchanged. //.. // assert( 0 != lmd.setDefaultThresholdLevelsIfValid(256, 90, 60, 30)); // assert(192 == lmd.defaultRecordLevel()); // assert( 64 == lmd.defaultPassLevel()); // assert( 48 == lmd.defaultTriggerLevel()); // assert( 32 == lmd.defaultTriggerAllLevel()); //.. // Finally, we can print the configuration value to 'stdout'. //.. // bsl::cout << lmd << bsl::endl; //.. // This produces the following (multi-line) output: //.. // [ // recordBufferSize : 32768 // loggerBufferSize : 2048 // recordLevel : 192 // passLevel : 64 // triggerLevel : 48 // triggerAllLevel : 32 // ] //.. #include <balscm_version.h> #include <bsl_iosfwd.h> namespace BloombergLP { namespace ball { // =========================== // class LoggerManagerDefaults // =========================== class LoggerManagerDefaults { // This class provides constrained configuration parameters for a logger // manager. The constraints are maintained as class invariants; it is not // possible to obtain an invalid object through this interface. // // More generally, this class supports a complete set of *value* *semantic* // operations, including copy construction, assignment, equality // comparison, 'ostream' printing. (A precise operational definition of // when two instances have the same value can be found in the description // of 'operator==' for the class.) This class is *exception* *neutral* // with no guarantee of rollback: if an exception is thrown during the // invocation of a method on a pre-existing instance, the object is left in // a valid state, but its value is undefined. In no event is memory // leaked. Finally, *aliasing* (e.g., using all or part of an object as // both source and destination) is supported in all cases. private: // DATA int d_recordBufferSize; // size of default logger's record buffer int d_loggerBufferSize; // size of logger "scratchpad" buffer (for macros) int d_defaultRecordLevel; int d_defaultPassLevel; int d_defaultTriggerLevel; int d_defaultTriggerAllLevel; // constrained set of default threshold levels for logger manager // FRIENDS friend bsl::ostream& operator<<(bsl::ostream&, const LoggerManagerDefaults&); friend bool operator==(const LoggerManagerDefaults&, const LoggerManagerDefaults&); public: // CLASS METHODS static bool isValidDefaultRecordBufferSize(int numBytes); // Return 'true' if the specified 'numBytes' is a valid default-logger // record-buffer size attribute, and 'false' otherwise. 'numBytes' is // valid if 0 < numBytes. static bool isValidDefaultLoggerBufferSize(int numBytes); // Return 'true' if the specified 'numBytes' is a valid default // logger-message-buffer size attribute, and 'false' otherwise. // 'numBytes' is valid if 0 < numBytes. static bool areValidDefaultThresholdLevels(int recordLevel, int passLevel, int triggerLevel, int triggerAllLevel); // Return 'true' if each of the specified 'recordLevel', 'passLevel', // 'triggerLevel', and 'triggerAllLevel' values is a valid default // severity threshold level attributes, and 'false' otherwise. Valid // severity threshold level values are in the range '[0 .. 255]'. static int defaultDefaultRecordBufferSize(); // Return the implementation-defined default-logger record-buffer size // value for this class. static int defaultDefaultLoggerBufferSize(); // Return the implementation-defined default logger-message-buffer size // value for this class. static int defaultDefaultRecordLevel(); // Return the implementation-defined default record threshold level // value for this class. static int defaultDefaultPassLevel(); // Return the implementation-defined default pass threshold level value // for this class. static int defaultDefaultTriggerLevel(); // Return the implementation-defined default trigger threshold level // value for this class. static int defaultDefaultTriggerAllLevel(); // Return the implementation-defined default trigger-all threshold // value for this class. // CREATORS LoggerManagerDefaults(); // Create a logger manager default-values constrained-attribute object // having valid default values for all attributes. LoggerManagerDefaults(const LoggerManagerDefaults& original); // Create a logger manager default-values constrained-attribute object // having the value of the specified 'original' object. ~LoggerManagerDefaults(); // Destroy this logger manager default-values constrained-attribute // object. // MANIPULATORS LoggerManagerDefaults& operator=(const LoggerManagerDefaults& rhs); // Assign to this logger manager default-values constrained-attribute // object the value of the specified 'rhs' object. int setDefaultRecordBufferSizeIfValid(int numBytes); // Set the default-logger record-buffer size attribute of this object // to the specified 'numBytes' if 0 < numBytes. Return 0 on success, // and a non-zero value (with no effect on the state of this object) // otherwise. int setDefaultLoggerBufferSizeIfValid(int numBytes); // Set the default logger-message-buffer size attribute of this object // to the specified 'numBytes' if 0 < numBytes. Return 0 on success, // and a non-zero value (with no effect on the state of this object) // otherwise. int setDefaultThresholdLevelsIfValid(int passLevel); // Set the pass-through severity threshold level attribute of the // 'LoggerManagerDefaults' attribute of this object to the // specified 'passLevel', if it is in the range '[0 .. 255]', and set // all the other threshold levels (recordLevel, triggerLevel, // triggerAllLevel) to 0. Return 0 on success, and a non-zero value // otherwise with no effect on this object. int setDefaultThresholdLevelsIfValid(int recordLevel, int passLevel, int triggerLevel, int triggerAllLevel); // Set the quadruplet of default severity threshold level attributes of // this object to the specified 'recordLevel', 'passLevel', // 'triggerLevel', and 'triggerAllLevel' values if each level is in the // range '[0 .. 255]'. Return 0 on success, and a non-zero value (with // no effect on the state of this object) otherwise. // ACCESSORS int defaultRecordBufferSize() const; // Return the default-logger record-buffer size attribute of this // object. int defaultLoggerBufferSize() const; // Return the default logger-message-buffer size attribute of this // object. int defaultRecordLevel() const; // Return the default record threshold level attribute of this object. int defaultPassLevel() const; // Return the default pass threshold level attribute of this object. int defaultTriggerLevel() const; // Return the default trigger threshold level attribute of this object. int defaultTriggerAllLevel() const; // Return the default trigger-all threshold level attribute of this // object. bsl::ostream& print(bsl::ostream& stream, int level = 0, int spacesPerLevel = 4) const; // Format this object to the specified output 'stream' at the (absolute // value of) the optionally specified indentation 'level' and return a // reference to 'stream'. If 'level' is specified, optionally specify // 'spacesPerLevel', the number of spaces per indentation level for // this and all of its nested objects. If 'level' is negative, // suppress indentation of the first line. If 'spacesPerLevel' is // negative, suppress all indentation AND format the entire output on // one line. If 'stream' is not valid on entry, this operation has no // effect. }; // FREE OPERATORS bool operator==(const LoggerManagerDefaults& lhs, const LoggerManagerDefaults& rhs); // Return 'true' if the specified 'lhs' and 'rhs' attribute objects have // the same value, and 'false' otherwise. Two attribute objects objects // have the same value if each respective attribute has the same value. bool operator!=(const LoggerManagerDefaults& lhs, const LoggerManagerDefaults& rhs); // Return 'true' if the specified 'lhs' and 'rhs' attribute objects do not // have the same value, and 'false' otherwise. Two attribute objects do // not have the same value if one or more respective attributes differ in // values. bsl::ostream& operator<<(bsl::ostream& stream, const LoggerManagerDefaults& defaults); // Write the specified 'defaults' object to the specified output 'stream' // in a reasonable multi-line format. } // close package namespace } // close enterprise namespace #endif // ---------------------------------------------------------------------------- // Copyright 2015 Bloomberg Finance L.P. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ----------------------------- END-OF-FILE ----------------------------------