forked from mirrors/gecko-dev
		
	GNop = Glean No-op. This disables all control and recording functionality when build for Android. Differential Revision: https://phabricator.services.mozilla.com/D106767
		
			
				
	
	
		
			301 lines
		
	
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			301 lines
		
	
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// -*- mode: C++ -*-
 | 
						|
 | 
						|
// AUTOGENERATED BY glean_parser.  DO NOT EDIT.
 | 
						|
 | 
						|
/* 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 mozilla_GleanJSMetricsLookup_h
 | 
						|
#define mozilla_GleanJSMetricsLookup_h
 | 
						|
 | 
						|
#include "mozilla/PerfectHash.h"
 | 
						|
#include "mozilla/Maybe.h"
 | 
						|
#include "mozilla/glean/bindings/MetricTypes.h"
 | 
						|
#include "mozilla/glean/fog_ffi_generated.h"
 | 
						|
 | 
						|
#define GLEAN_INDEX_BITS (32)
 | 
						|
#define GLEAN_ID_BITS (27)
 | 
						|
#define GLEAN_TYPE_ID(id) ((id) >> GLEAN_ID_BITS)
 | 
						|
#define GLEAN_METRIC_ID(id) ((id) & ((1ULL << GLEAN_ID_BITS) - 1))
 | 
						|
#define GLEAN_OFFSET(entry) (entry & ((1ULL << GLEAN_INDEX_BITS) - 1))
 | 
						|
 | 
						|
namespace mozilla::glean {
 | 
						|
 | 
						|
// The category lookup table's entry type
 | 
						|
using category_entry_t = uint32_t;
 | 
						|
// The metric lookup table's entry type
 | 
						|
using metric_entry_t = uint64_t;
 | 
						|
 | 
						|
static_assert(GLEAN_INDEX_BITS + GLEAN_ID_BITS < sizeof(metric_entry_t) * 8, "Index and ID bits need to fit into an category_entry_t");
 | 
						|
static_assert(GLEAN_ID_BITS < sizeof(uint32_t) * 8, "Metric IDs need to fit into less than 32 bit");
 | 
						|
static_assert(2 < UINT32_MAX, "Too many metric categories generated.");
 | 
						|
static_assert(17 < 134217728, "Too many metrics generated.");
 | 
						|
static_assert(13 < 32, "Too many different metric types.");
 | 
						|
 | 
						|
static already_AddRefed<nsISupports> NewMetricFromId(uint32_t id) {
 | 
						|
  uint32_t typeId = GLEAN_TYPE_ID(id);
 | 
						|
  uint32_t metricId = GLEAN_METRIC_ID(id);
 | 
						|
 | 
						|
  switch (typeId) {
 | 
						|
    case 1: /* boolean */
 | 
						|
    {
 | 
						|
      return MakeAndAddRef<GleanBoolean>(metricId);
 | 
						|
    }
 | 
						|
    case 2: /* labeled_boolean */
 | 
						|
    {
 | 
						|
      return MakeAndAddRef<GleanLabeled>(metricId, 2);
 | 
						|
    }
 | 
						|
    case 3: /* counter */
 | 
						|
    {
 | 
						|
      return MakeAndAddRef<GleanCounter>(metricId);
 | 
						|
    }
 | 
						|
    case 4: /* labeled_counter */
 | 
						|
    {
 | 
						|
      return MakeAndAddRef<GleanLabeled>(metricId, 4);
 | 
						|
    }
 | 
						|
    case 5: /* string */
 | 
						|
    {
 | 
						|
      return MakeAndAddRef<GleanString>(metricId);
 | 
						|
    }
 | 
						|
    case 6: /* labeled_string */
 | 
						|
    {
 | 
						|
      return MakeAndAddRef<GleanLabeled>(metricId, 6);
 | 
						|
    }
 | 
						|
    case 7: /* string_list */
 | 
						|
    {
 | 
						|
      return MakeAndAddRef<GleanStringList>(metricId);
 | 
						|
    }
 | 
						|
    case 8: /* timespan */
 | 
						|
    {
 | 
						|
      return MakeAndAddRef<GleanTimespan>(metricId);
 | 
						|
    }
 | 
						|
    case 9: /* timing_distribution */
 | 
						|
    {
 | 
						|
      return MakeAndAddRef<GleanTimingDistribution>(metricId);
 | 
						|
    }
 | 
						|
    case 10: /* memory_distribution */
 | 
						|
    {
 | 
						|
      return MakeAndAddRef<GleanMemoryDistribution>(metricId);
 | 
						|
    }
 | 
						|
    case 11: /* uuid */
 | 
						|
    {
 | 
						|
      return MakeAndAddRef<GleanUuid>(metricId);
 | 
						|
    }
 | 
						|
    case 12: /* datetime */
 | 
						|
    {
 | 
						|
      return MakeAndAddRef<GleanDatetime>(metricId);
 | 
						|
    }
 | 
						|
    case 13: /* event */
 | 
						|
    {
 | 
						|
      return MakeAndAddRef<GleanEvent>(metricId);
 | 
						|
    }
 | 
						|
    default:
 | 
						|
    MOZ_ASSERT_UNREACHABLE("Invalid type ID reached when trying to instantiate a new metric");
 | 
						|
    return nullptr;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
static already_AddRefed<nsISupports> NewSubMetricFromIds(uint32_t aParentTypeId, uint32_t aParentMetricId, const nsACString& aLabel) {
 | 
						|
  switch (aParentTypeId) {
 | 
						|
    case 2: { /* labeled_boolean */
 | 
						|
#ifdef MOZ_GLEAN_ANDROID
 | 
						|
      auto id = 0;
 | 
						|
#else
 | 
						|
      auto id = impl::fog_labeled_boolean_get(aParentMetricId, &aLabel);
 | 
						|
#endif
 | 
						|
      return MakeAndAddRef<GleanBoolean>(id);
 | 
						|
    }
 | 
						|
    case 4: { /* labeled_counter */
 | 
						|
#ifdef MOZ_GLEAN_ANDROID
 | 
						|
      auto id = 0;
 | 
						|
#else
 | 
						|
      auto id = impl::fog_labeled_counter_get(aParentMetricId, &aLabel);
 | 
						|
#endif
 | 
						|
      return MakeAndAddRef<GleanCounter>(id);
 | 
						|
    }
 | 
						|
    case 6: { /* labeled_string */
 | 
						|
#ifdef MOZ_GLEAN_ANDROID
 | 
						|
      auto id = 0;
 | 
						|
#else
 | 
						|
      auto id = impl::fog_labeled_string_get(aParentMetricId, &aLabel);
 | 
						|
#endif
 | 
						|
      return MakeAndAddRef<GleanString>(id);
 | 
						|
    }
 | 
						|
    default: {
 | 
						|
      MOZ_ASSERT_UNREACHABLE("Invalid type ID for submetric.");
 | 
						|
      return nullptr;
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
static Maybe<uint32_t> category_result_check(const nsACString& aKey, category_entry_t entry);
 | 
						|
static Maybe<uint32_t> metric_result_check(const nsACString& aKey, metric_entry_t entry);
 | 
						|
 | 
						|
#if defined(_MSC_VER) && !defined(__clang__)
 | 
						|
const char gCategoryStringTable[] = {
 | 
						|
#else
 | 
						|
constexpr char gCategoryStringTable[] = {
 | 
						|
#endif
 | 
						|
  /*     0 - "test" */ 't', 'e', 's', 't', '\0',
 | 
						|
  /*     5 - "testNested" */ 't', 'e', 's', 't', 'N', 'e', 's', 't', 'e', 'd', '\0',
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
static_assert(sizeof(gCategoryStringTable) < UINT32_MAX, "Category string table is too large.");
 | 
						|
 | 
						|
const category_entry_t sCategoryByNameLookupEntries[] = {
 | 
						|
  5,
 | 
						|
  0
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
 | 
						|
static Maybe<uint32_t>
 | 
						|
CategoryByNameLookup(const nsACString& aKey)
 | 
						|
{
 | 
						|
  static const uint8_t BASES[] = {
 | 
						|
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,
 | 
						|
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
 | 
						|
       0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
 | 
						|
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
 | 
						|
  };
 | 
						|
  
 | 
						|
 | 
						|
  const char* bytes = aKey.BeginReading();
 | 
						|
  size_t length = aKey.Length();
 | 
						|
  auto& entry = mozilla::perfecthash::Lookup(bytes, length, BASES,
 | 
						|
                                             sCategoryByNameLookupEntries);
 | 
						|
  return category_result_check(aKey, entry);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
#if defined(_MSC_VER) && !defined(__clang__)
 | 
						|
const char gMetricStringTable[] = {
 | 
						|
#else
 | 
						|
constexpr char gMetricStringTable[] = {
 | 
						|
#endif
 | 
						|
  /*     0 - "test.booleanMetric" */ 't', 'e', 's', 't', '.', 'b', 'o', 'o', 'l', 'e', 'a', 'n', 'M', 'e', 't', 'r', 'i', 'c', '\0',
 | 
						|
  /*    19 - "test.labeledBooleanMetric" */ 't', 'e', 's', 't', '.', 'l', 'a', 'b', 'e', 'l', 'e', 'd', 'B', 'o', 'o', 'l', 'e', 'a', 'n', 'M', 'e', 't', 'r', 'i', 'c', '\0',
 | 
						|
  /*    45 - "test.labeledBooleanMetricLabels" */ 't', 'e', 's', 't', '.', 'l', 'a', 'b', 'e', 'l', 'e', 'd', 'B', 'o', 'o', 'l', 'e', 'a', 'n', 'M', 'e', 't', 'r', 'i', 'c', 'L', 'a', 'b', 'e', 'l', 's', '\0',
 | 
						|
  /*    77 - "test.counterMetric" */ 't', 'e', 's', 't', '.', 'c', 'o', 'u', 'n', 't', 'e', 'r', 'M', 'e', 't', 'r', 'i', 'c', '\0',
 | 
						|
  /*    96 - "test.labeledCounterMetric" */ 't', 'e', 's', 't', '.', 'l', 'a', 'b', 'e', 'l', 'e', 'd', 'C', 'o', 'u', 'n', 't', 'e', 'r', 'M', 'e', 't', 'r', 'i', 'c', '\0',
 | 
						|
  /*   122 - "test.labeledCounterMetricLabels" */ 't', 'e', 's', 't', '.', 'l', 'a', 'b', 'e', 'l', 'e', 'd', 'C', 'o', 'u', 'n', 't', 'e', 'r', 'M', 'e', 't', 'r', 'i', 'c', 'L', 'a', 'b', 'e', 'l', 's', '\0',
 | 
						|
  /*   154 - "test.stringMetric" */ 't', 'e', 's', 't', '.', 's', 't', 'r', 'i', 'n', 'g', 'M', 'e', 't', 'r', 'i', 'c', '\0',
 | 
						|
  /*   172 - "test.labeledStringMetric" */ 't', 'e', 's', 't', '.', 'l', 'a', 'b', 'e', 'l', 'e', 'd', 'S', 't', 'r', 'i', 'n', 'g', 'M', 'e', 't', 'r', 'i', 'c', '\0',
 | 
						|
  /*   197 - "test.labeledStringMetricLabels" */ 't', 'e', 's', 't', '.', 'l', 'a', 'b', 'e', 'l', 'e', 'd', 'S', 't', 'r', 'i', 'n', 'g', 'M', 'e', 't', 'r', 'i', 'c', 'L', 'a', 'b', 'e', 'l', 's', '\0',
 | 
						|
  /*   228 - "test.stringListMetric" */ 't', 'e', 's', 't', '.', 's', 't', 'r', 'i', 'n', 'g', 'L', 'i', 's', 't', 'M', 'e', 't', 'r', 'i', 'c', '\0',
 | 
						|
  /*   250 - "test.timespanMetric" */ 't', 'e', 's', 't', '.', 't', 'i', 'm', 'e', 's', 'p', 'a', 'n', 'M', 'e', 't', 'r', 'i', 'c', '\0',
 | 
						|
  /*   270 - "test.timingDistributionMetric" */ 't', 'e', 's', 't', '.', 't', 'i', 'm', 'i', 'n', 'g', 'D', 'i', 's', 't', 'r', 'i', 'b', 'u', 't', 'i', 'o', 'n', 'M', 'e', 't', 'r', 'i', 'c', '\0',
 | 
						|
  /*   300 - "test.memoryDistributionMetric" */ 't', 'e', 's', 't', '.', 'm', 'e', 'm', 'o', 'r', 'y', 'D', 'i', 's', 't', 'r', 'i', 'b', 'u', 't', 'i', 'o', 'n', 'M', 'e', 't', 'r', 'i', 'c', '\0',
 | 
						|
  /*   330 - "testNested.uuidMetric" */ 't', 'e', 's', 't', 'N', 'e', 's', 't', 'e', 'd', '.', 'u', 'u', 'i', 'd', 'M', 'e', 't', 'r', 'i', 'c', '\0',
 | 
						|
  /*   352 - "testNested.datetimeMetric" */ 't', 'e', 's', 't', 'N', 'e', 's', 't', 'e', 'd', '.', 'd', 'a', 't', 'e', 't', 'i', 'm', 'e', 'M', 'e', 't', 'r', 'i', 'c', '\0',
 | 
						|
  /*   378 - "testNested.eventMetric" */ 't', 'e', 's', 't', 'N', 'e', 's', 't', 'e', 'd', '.', 'e', 'v', 'e', 'n', 't', 'M', 'e', 't', 'r', 'i', 'c', '\0',
 | 
						|
  /*   401 - "testNested.eventMetricWithExtra" */ 't', 'e', 's', 't', 'N', 'e', 's', 't', 'e', 'd', '.', 'e', 'v', 'e', 'n', 't', 'M', 'e', 't', 'r', 'i', 'c', 'W', 'i', 't', 'h', 'E', 'x', 't', 'r', 'a', '\0',
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
static_assert(sizeof(gMetricStringTable) < 4294967296, "Metric string table is too large.");
 | 
						|
 | 
						|
const metric_entry_t sMetricByNameLookupEntries[] = {
 | 
						|
  1729382274090139725,
 | 
						|
  3458764552475246789,
 | 
						|
  1152921513196781587,
 | 
						|
  2305843030688530528,
 | 
						|
  5188146822270419214,
 | 
						|
  7493989848663982458,
 | 
						|
  1152921517491748909,
 | 
						|
  576460756598390784,
 | 
						|
  4035225309073637604,
 | 
						|
  6341068335467200842,
 | 
						|
  6917529092065591648,
 | 
						|
  4611686065672028410,
 | 
						|
  7493989852958949777,
 | 
						|
  2305843034983497850,
 | 
						|
  5764607578868810028,
 | 
						|
  3458764548180279468,
 | 
						|
  2882303791581888666
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
 | 
						|
static Maybe<uint32_t>
 | 
						|
MetricByNameLookup(const nsACString& aKey)
 | 
						|
{
 | 
						|
  static const uint8_t BASES[] = {
 | 
						|
       0,   0,   0,   2,   0,   0,   0,   1,   1,   0,   0,   0,   0,   0,   0,   0,
 | 
						|
       2,   0,   0,   0,   1,   0,   0,   1,   0,   5,   0,   0,   4,   0,   1,   0,
 | 
						|
       2,   0,   0,   0,   0,   0,   0,   0,   4,   0,   0,   2,   0,   6,   0,   0,
 | 
						|
       0,   0,  20,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,  10,
 | 
						|
  };
 | 
						|
  
 | 
						|
 | 
						|
  const char* bytes = aKey.BeginReading();
 | 
						|
  size_t length = aKey.Length();
 | 
						|
  auto& entry = mozilla::perfecthash::Lookup(bytes, length, BASES,
 | 
						|
                                             sMetricByNameLookupEntries);
 | 
						|
  return metric_result_check(aKey, entry);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * Get a category's name from the string table.
 | 
						|
 */
 | 
						|
static const char* GetCategoryName(category_entry_t entry) {
 | 
						|
  MOZ_ASSERT(entry < sizeof(gCategoryStringTable), "Entry identifier offset larger than string table");
 | 
						|
  return &gCategoryStringTable[entry];
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Get a metric's identifier from the string table.
 | 
						|
 */
 | 
						|
static const char* GetMetricIdentifier(metric_entry_t entry) {
 | 
						|
  uint32_t offset = GLEAN_OFFSET(entry);
 | 
						|
  MOZ_ASSERT(offset < sizeof(gMetricStringTable), "Entry identifier offset larger than string table");
 | 
						|
  return &gMetricStringTable[offset];
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Check that the found entry is pointing to the right key
 | 
						|
 * and return it.
 | 
						|
 * Or return `Nothing()` if the entry was not found.
 | 
						|
 */
 | 
						|
static Maybe<uint32_t> category_result_check(const nsACString& aKey, category_entry_t entry) {
 | 
						|
  if (MOZ_UNLIKELY(entry > sizeof(gCategoryStringTable))) {
 | 
						|
    return Nothing();
 | 
						|
  }
 | 
						|
  if (aKey.EqualsASCII(gCategoryStringTable + entry)) {
 | 
						|
    return Some(entry);
 | 
						|
  }
 | 
						|
  return Nothing();
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Check if the found entry index is pointing to the right key
 | 
						|
 * and return the corresponding metric ID.
 | 
						|
 * Or return `Nothing()` if the entry was not found.
 | 
						|
 */
 | 
						|
static Maybe<uint32_t> metric_result_check(const nsACString& aKey, uint64_t entry) {
 | 
						|
  uint32_t metricId = entry >> GLEAN_INDEX_BITS;
 | 
						|
  uint32_t offset = GLEAN_OFFSET(entry);
 | 
						|
 | 
						|
  if (offset > sizeof(gMetricStringTable)) {
 | 
						|
    return Nothing();
 | 
						|
  }
 | 
						|
 | 
						|
  if (aKey.EqualsASCII(gMetricStringTable + offset)) {
 | 
						|
    return Some(metricId);
 | 
						|
  }
 | 
						|
 | 
						|
  return Nothing();
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
#undef GLEAN_INDEX_BITS
 | 
						|
#undef GLEAN_ID_BITS
 | 
						|
#undef GLEAN_TYPE_ID
 | 
						|
#undef GLEAN_METRIC_ID
 | 
						|
#undef GLEAN_OFFSET
 | 
						|
 | 
						|
} // namespace mozilla::glean
 | 
						|
#endif // mozilla_GleanJSMetricsLookup_h
 |