diff options
Diffstat (limited to 'toolkit/components/telemetry/core/ScalarInfo.h')
-rw-r--r-- | toolkit/components/telemetry/core/ScalarInfo.h | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/toolkit/components/telemetry/core/ScalarInfo.h b/toolkit/components/telemetry/core/ScalarInfo.h new file mode 100644 index 0000000000..125ea7e88e --- /dev/null +++ b/toolkit/components/telemetry/core/ScalarInfo.h @@ -0,0 +1,94 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef TelemetryScalarInfo_h__ +#define TelemetryScalarInfo_h__ + +#include "TelemetryCommon.h" + +// This module is internal to Telemetry. It defines a structure that holds the +// scalar info. It should only be used by TelemetryScalarData.h automatically +// generated file and TelemetryScalar.cpp. This should not be used anywhere +// else. For the public interface to Telemetry functionality, see Telemetry.h. + +namespace { + +/** + * Base scalar information, common to both "static" and dynamic scalars. + */ +struct BaseScalarInfo { + uint32_t kind; + uint32_t dataset; + mozilla::Telemetry::Common::RecordedProcessType record_in_processes; + bool keyed; + uint32_t key_count; + uint32_t key_offset; + mozilla::Telemetry::Common::SupportedProduct products; + bool builtin; + + constexpr BaseScalarInfo( + uint32_t aKind, uint32_t aDataset, + mozilla::Telemetry::Common::RecordedProcessType aRecordInProcess, + bool aKeyed, uint32_t aKeyCount, uint32_t aKeyOffset, + mozilla::Telemetry::Common::SupportedProduct aProducts, + bool aBuiltin = true) + : kind(aKind), + dataset(aDataset), + record_in_processes(aRecordInProcess), + keyed(aKeyed), + key_count(aKeyCount), + key_offset(aKeyOffset), + products(aProducts), + builtin(aBuiltin) {} + virtual ~BaseScalarInfo() = default; + + virtual const char* name() const = 0; + virtual const char* expiration() const = 0; + + virtual uint32_t storeOffset() const = 0; + virtual uint32_t storeCount() const = 0; +}; + +/** + * "Static" scalar definition: these are the ones riding + * the trains. + */ +struct ScalarInfo : BaseScalarInfo { + uint32_t name_offset; + uint32_t expiration_offset; + uint32_t store_count; + uint16_t store_offset; + + // In order to cleanly support dynamic scalars in TelemetryScalar.cpp, we need + // to use virtual functions for |name| and |expiration|, as they won't be + // looked up in the static tables in that case. However, using virtual + // functions makes |ScalarInfo| non-aggregate and prevents from using + // aggregate initialization (curly brackets) in the generated + // TelemetryScalarData.h. To work around this problem we define a constructor + // that takes the exact number of parameters we need. + constexpr ScalarInfo( + uint32_t aKind, uint32_t aNameOffset, uint32_t aExpirationOffset, + uint32_t aDataset, + mozilla::Telemetry::Common::RecordedProcessType aRecordInProcess, + bool aKeyed, uint32_t aKeyCount, uint32_t aKeyOffset, + mozilla::Telemetry::Common::SupportedProduct aProducts, + uint32_t aStoreCount, uint32_t aStoreOffset) + : BaseScalarInfo(aKind, aDataset, aRecordInProcess, aKeyed, aKeyCount, + aKeyOffset, aProducts), + name_offset(aNameOffset), + expiration_offset(aExpirationOffset), + store_count(aStoreCount), + store_offset(aStoreOffset) {} + + const char* name() const override; + const char* expiration() const override; + + uint32_t storeOffset() const override { return store_offset; }; + uint32_t storeCount() const override { return store_count; }; +}; + +} // namespace + +#endif // TelemetryScalarInfo_h__ |