CodeSonar C++ API
[For improved navigation, enable JavaScript.]
csonar_metricclass.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2023-2025, an unpublished work by CodeSecure, Inc.
3  * ALL RIGHTS RESERVED
4  *
5  * Copyright (c) 2013-2023, an unpublished work by GrammaTech, Inc.
6  * ALL RIGHTS RESERVED
7  *
8  * This software is furnished under a license and may be used and
9  * copied only in accordance with the terms of such license and the
10  * inclusion of the above copyright notice. This software or any
11  * other copies thereof may not be provided or otherwise made
12  * available to any other person. Title to and ownership of the
13  * software is retained by CodeSecure, Inc.
14  */
15 
16 #ifndef CS_METRICCLASS_HPP
17 #define CS_METRICCLASS_HPP
18 
19 #include "csurf/src/api/cpp/cs_api.hpp"
20 #include "codesonar/src/progtrav/csonar_plugin.h"
21 
22 #if !DOXYGEN_ONLY
23 #define DOX_METRICCLASS_TYPEDEFS(gran, ...)
24 #endif
25 
26 
27 
28 #ifdef SWIG
29 #ifdef SWIGJAVA
30 %nojavaexception ~metricclass_flags;
31 %nojavaexception ~metricclass;
32 %nojavaexception ~metricclass_manager;
33 #endif
34 #endif
35 
41 namespace cs{
42 
43 
63  CS_FLAGS_BOILERPLATE(
64  metricclass_flags, cs_metricclass_flags,
65  csmetric_flags_all,
66  "auto",
67  "post-analysis"
68  );
70  static const metricclass_flags NONE;
71 
78  static const metricclass_flags AUTO;
79 
120  static const metricclass_flags POST_ANALYSIS;
121  };
122  CS_FLAGS_BOILERPLATE_FRIENDS(metricclass_flags,
123  template<typename T> friend class metricclass_manager;
124  template<typename T> friend class metricclass;,
126  );
127 #ifdef CS_CPP_IMPL
128  const metricclass_flags metricclass_flags::NONE = metricclass_flags(csmetric_flags_none);
129  const metricclass_flags metricclass_flags::AUTO = metricclass_flags(csmetric_flags_auto);
130  const metricclass_flags metricclass_flags::POST_ANALYSIS = metricclass_flags(csmetric_flags_post_analysis);
131 #endif
132 
140  template <typename T>
141  class metricclass_manager{
142  metricclass_manager();
143  public:
155  static metricclass<T> lookup(const std::string &tag);
156 
157  DISOWN_PARAMETER(metric_function<T> *metricclass_func_ptr)
158 
159 
160 
205  static metricclass<T> create(
206  metric_function<T> *metricclass_func_ptr,
207  const std::string &tag,
208  const std::string &desc,
210 
211 
256  static metricclass<T> create(
257  const std::string &tag,
258  const std::string &desc,
260 
268  static iterator_adapter<metricclass_iterator_policy<T> > metricclasses();
269  };
270 
271 #ifdef SWIG
272 #ifdef SWIGPYTHON
273 /* Make some decorators -- see cs_metric.hpp */
274 METFUNC_DECORATOR(project_metricclass_function, project_metricclass_manager, _project_metric_function)
275 METFUNC_DECORATOR(compunit_metricclass_function, compunit_metricclass_manager, _compunit_metric_function)
276 METFUNC_DECORATOR(sfile_metricclass_function, sfile_metricclass_manager, _sfile_metric_function)
277 METFUNC_DECORATOR(procedure_metricclass_function, procedure_metricclass_manager, _procedure_metric_function)
278 #endif
279 
280  %template(project_metricclass_manager) metricclass_manager<project>;
281  %template(compunit_metricclass_manager) metricclass_manager<compunit>;
282  %template(sfile_metricclass_manager) metricclass_manager<sfile>;
283  %template(procedure_metricclass_manager) metricclass_manager<procedure>;
284 #endif
285 
287  typedef metricclass_manager<project> project_metricclass_manager;
288 
289  typedef metricclass_manager<compunit> compunit_metricclass_manager;
290 
291  typedef metricclass_manager<sfile> sfile_metricclass_manager;
292 
293  typedef metricclass_manager<procedure> procedure_metricclass_manager;
296  template<>
297  class metricclass_granularity_policy<project>{
298  friend class metricclass_manager<project>;
299  friend class metricclass_iterator_policy<project>;
300  friend class metricclass<project>;
301  static cs_result delegate(double *val, const void *ctx)
302  {
304  = static_cast<metric_function<project>*>(
305  const_cast<void*>(ctx));
306  return func->delegate(val, cs::project::current());
307  }
308 
309  static void report(cs_metricclass_t m, project p, double val)
310  {
311  check(csonar_report_metric_analysis(
312  m, val));
313  }
314 
315  static double value(cs_metricclass_t m, project p)
316  {
317  double rv;
318  check(csonar_metric_getvalue_analysis(
319  m, &rv));
320  return rv;
321  }
322 
323  static void retract(cs_metricclass_t m, project p)
324  {}
325 
326  static cs_metricclass_t create(const char *tag, const char *desc,
327  metric_function<project> *func,
328  cs_metricclass_flags flags)
329  {
330  cs_metricclass_t m;
331  check(csonar_metric_create_class_analysis(
332  tag, desc,
333  func ? delegate : NULL,
334  flags,
335  static_cast<void*>(func),
336  &m));
337  return m;
338  }
339 
340  static cs_metric_granularity granularity()
341  { return csmetric_analysis; }
342 
343  static const char *name()
344  { return "project"; }
345  };
346 
347  template<>
348  class metricclass_granularity_policy<compunit>{
349  friend class metricclass_manager<compunit>;
350  friend class metricclass_iterator_policy<compunit>;
351  friend class metricclass<compunit>;
352  static cs_result delegate(
353  cglue<compunit>::ctype elt,
354  double *val, const void *ctx)
355  {
357  = static_cast<metric_function<compunit>*>(
358  const_cast<void*>(ctx));
359  return func->delegate(val, compunit::);
360  }
361 
362  static void report(cs_metricclass_t m, compunit p, double val)
363  {
364  check(csonar_report_metric_compunit(
365  m, val, cglue<compunit>::unwrap(p)));
366  }
367 
368  static double value(cs_metricclass_t m, compunit p)
369  {
370  double rv;
371  check(csonar_metric_getvalue_compunit(
372  m, cglue<compunit>::unwrap(p), &rv));
373  return rv;
374  }
375 
376  static void retract(cs_metricclass_t m, compunit p)
377  {
378  check(csonar_metric_retract_compunit(
379  m, cglue<compunit>::unwrap(p)));
380  }
381 
382  static cs_metricclass_t create(const char *tag, const char *desc,
383  metric_function<compunit> *func,
384  cs_metricclass_flags flags)
385  {
386  cs_metricclass_t m;
387  check(csonar_metric_create_class_compunit(
388  tag, desc,
389  func ? delegate : NULL,
390  flags,
391  static_cast<void*>(func),
392  &m));
393  return m;
394  }
395 
396  static cs_metric_granularity granularity()
397  { return csmetric_compunit; }
398 
399  static const char *name()
400  { return "compunit"; }
401  };
402 
403  template<>
404  class metricclass_granularity_policy<sfile>{
405  friend class metricclass_manager<sfile>;
406  friend class metricclass_iterator_policy<sfile>;
407  friend class metricclass<sfile>;
408  static cs_result delegate(
409  cglue<sfile>::ctype elt,
410  double *val, const void *ctx)
411  {
413  = static_cast<metric_function<sfile>*>(
414  const_cast<void*>(ctx));
415  return func->delegate(val, sfile::);
416  }
417 
418  static void report(cs_metricclass_t m, sfile p, double val)
419  {
420  check(csonar_report_metric_file(
421  m, val, cglue<sfile>::unwrap(p)));
422  }
423 
424  static double value(cs_metricclass_t m, sfile p)
425  {
426  double rv;
427  check(csonar_metric_getvalue_file(
428  m, cglue<sfile>::unwrap(p), &rv));
429  return rv;
430  }
431 
432  static void retract(cs_metricclass_t m, sfile p)
433  {
434  check(csonar_metric_retract_file(
435  m, cglue<sfile>::unwrap(p)));
436  }
437 
438  static cs_metricclass_t create(const char *tag, const char *desc,
439  metric_function<sfile> *func,
440  cs_metricclass_flags flags)
441  {
442  cs_metricclass_t m;
443  check(csonar_metric_create_class_file(
444  tag, desc,
445  func ? delegate : NULL,
446  flags,
447  static_cast<void*>(func),
448  &m));
449  return m;
450  }
451 
452  static cs_metric_granularity granularity()
453  { return csmetric_file; }
454 
455  static const char *name()
456  { return "sfile"; }
457  };
458 
459  template<>
460  class metricclass_granularity_policy<procedure>{
461  friend class metricclass_manager<procedure>;
462  friend class metricclass_iterator_policy<procedure>;
463  friend class metricclass<procedure>;
464  static cs_result delegate(
465  cglue<procedure>::ctype elt,
466  double *val, const void *ctx)
467  {
469  = static_cast<metric_function<procedure>*>(
470  const_cast<void*>(ctx));
471  return func->delegate(val, procedure::);
472  }
473 
474  static void report(cs_metricclass_t m, procedure p, double val)
475  {
476  check(csonar_report_metric_procedure(
477  m, val, cglue<procedure>::unwrap(p)));
478  }
479 
480  static double value(cs_metricclass_t m, procedure p)
481  {
482  double rv;
483  check(csonar_metric_getvalue_procedure(
484  m, cglue<procedure>::unwrap(p), &rv));
485  return rv;
486  }
487 
488  static void retract(cs_metricclass_t m, procedure p)
489  {
490  check(csonar_metric_retract_procedure(
491  m, cglue<procedure>::unwrap(p)));
492  }
493 
494  static cs_metricclass_t create(const char *tag, const char *desc,
495  metric_function<procedure> *func,
496  cs_metricclass_flags flags)
497  {
498  cs_metricclass_t m;
499  check(csonar_metric_create_class_procedure(
500  tag, desc,
501  func ? delegate : NULL,
502  flags,
503  static_cast<void*>(func),
504  &m));
505  return m;
506  }
507 
508  static cs_metric_granularity granularity()
509  { return csmetric_procedure; }
510 
511  static const char *name()
512  { return "procedure"; }
513  };
514 
515  CS_NODEFCTOR_TYPE(metricclass);
516  template<typename T>
517  class cglue<metricclass<T> >
518  {
519  friend class metricclass_manager<T>;
520  friend class iterator_adapter<metricclass_iterator_policy<T> >;
521  friend class metricclass<T>;
522  friend class scratchpad<metricclass<T> >;
523  friend class metricclass_iterator_policy<T>;
524  cglue();
525  public:
526  typedef cs_metricclass_t ctype;
527  typedef metricclass<T> type;
528  CS_CXX_API_CGLUE_ACCESS_MODIFIER:
529  static type wrap(const ctype &c)
530  { return type(c); }
531  static ctype unwrap(const type &c)
532  { return c.unwrap(); }
533  private:
534  static int ccmp(const ctype &a, const ctype &b)
535  { return csonar_metric_compare(a,b); }
536  static int chash(const ctype &a)
537  { return csonar_metric_hash(a); }
538  };
539 
540 
555  template <typename T>
556  class metricclass{
562  CS_IR_BOILERPLATE_TYPENAME(metricclass);
563 
565  std::string as_string() const
566  { return csonar_metric_tag( inner ); }
567 
569  std::string as_repr() const
570  { return CS_AS_REPR_FROM_STRING(metricclass); }
571 
572 
590  std::string tag() const
591  { return csonar_metric_tag( inner ); }
592 
593 
607  std::string description() const
608  {
609  const char *rv = csonar_metric_description( inner );
610  if( !rv )
611  return "";
612  return rv;
613  }
614 
629  bool always_discarded() const
630  {
631  if( !inner )
632  check(CS_ERROR_INVALID_ARGUMENT);
633  return !!csonar_metricclass_always_discarded(inner);
634  }
635 
651  bool allowed() const
652  {
653  if( !inner )
654  check(CS_ERROR_INVALID_ARGUMENT);
655  return !!csonar_metricclass_allowed(inner);
656  }
657 
658 
706  void report(T elt, double val) const
707  { return metricclass_granularity_policy<T>::report(inner, elt, val); }
708 
709 
746  double value(T elt) const
747  { return metricclass_granularity_policy<T>::value(inner, elt); }
748 
749 
780  void retract(T elt) const
781  { return metricclass_granularity_policy<T>::retract(inner, elt); }
782 
783 
791  metricclass_flags flags() const
792  { return cglue<metricclass_flags>::wrap( csonar_metric_flags( inner ) ); }
793  };
794 
795 
796 #ifdef SWIG
797 
798  /* Analysis (\ref project) granularity metric class (\ref metricclass).
799  */
800  %template(project_metricclass) metricclass<project>;
801 
802  /* Compilation unit (\ref compunit) granularity metric class (\ref
803  * metricclass).
804  */
805  %template(compunit_metricclass) metricclass<compunit>;
806 
807  /* Source file (\ref sfile) granularity metric class (\ref metricclass).
808  */
809  %template(sfile_metricclass) metricclass<sfile>;
810  /* Procedure (\ref procedure) granularity metric class (\ref metricclass).
811  */
812  %template(procedure_metricclass) metricclass<procedure>;
813 #endif
814 
816  typedef metricclass<project> project_metricclass;
817 
818  typedef metricclass<compunit> compunit_metricclass;
819 
820  typedef metricclass<sfile> sfile_metricclass;
821 
822  typedef metricclass<procedure> procedure_metricclass;
826  template<typename T>
827  class metricclass_iterator_policy{
828  public:
829  typedef cs_metric_class_iterator iterator_impl;
830  typedef metricclass<T> key;
831  typedef char ctype;
832 
833  static cs_result iter_first(
834  ctype container,
835  typename cglue<key>::ctype *val,
836  iterator_impl *it)
837  { return csonar_metric_class_iter_first(
838  metricclass_granularity_policy<T>::granularity(),
839  val, it ); }
840  static cs_result iter_next(
841  ctype container,
842  typename cglue<key>::ctype *val,
843  iterator_impl *it)
844  { return csonar_metric_class_iter_next( val, it ); }
845  static cs_result iter_close(iterator_impl *it)
846  { return csonar_metric_class_iter_close( it ); }
847  static std::string name()
848  { return std::string(metricclass_granularity_policy<T>::name())
849  + std::string("_metricclass_iterator"); }
850  };
851 
852 #ifdef SWIG
853  %template() metricclass_iterator_policy<project>;
854  %template() metricclass_iterator_policy<compunit>;
855  %template() metricclass_iterator_policy<sfile>;
856  %template() metricclass_iterator_policy<procedure>;
857 #endif
858 
859  NOT_SWIG_BUILD_ONLY( \ \
865  template<typename T>
866  inline bool operator==(const metricclass<T>& a, const metricclass<T>& b)
867  { return a.cmp(b) == 0; }
868  \ \
874  template<typename T>
875  inline bool operator!=(const metricclass<T>& a, const metricclass<T>& b)
876  { return a.cmp(b) != 0; }
877  \ \
883  template<typename T>
884  inline bool operator<(const metricclass<T>& a, const metricclass<T>& b)
885  { return a.cmp(b) < 0; }
886  \ \
892  template<typename T>
893  inline bool operator<=(const metricclass<T>& a, const metricclass<T>& b)
894  { return a.cmp(b) <= 0; }
895  \ \
901  template<typename T>
902  inline bool operator>(const metricclass<T>& a, const metricclass<T>& b)
903  { return a.cmp(b) > 0; }
904  \ \
910  template<typename T>
911  inline bool operator>=(const metricclass<T>& a, const metricclass<T>& b)
912  { return a.cmp(b) >= 0; } )
913 
919  template<typename T>
920  inline std::ostream &operator<<( std::ostream &out, const metricclass<T> &a )
921  {
922  return out << CS_AS_REPR_PREFIX << "metricclass "
923  << metricclass_granularity_policy<T>::name()
924  << a.as_string() << CS_AS_REPR_SUFFIX;
925  }
926 
927  template <typename T>
928  inline metricclass<T> metricclass_manager<T>::lookup(
929  const std::string &tag)
930  {
931  cs_metricclass_t m;
932  check(csonar_metric_get_class(
933  tag.c_str(),
934  metricclass_granularity_policy<T>::granularity(),
935  &m));
936  return cglue<metricclass<T> >::wrap(m);
937  }
938 
939  template <typename T>
940  inline metricclass<T> metricclass_manager<T>::create(
941  metric_function<T> *metricclass_func_ptr,
942  const std::string &tag,
943  const std::string &desc,
944  metricclass_flags flags)
945  {
946  /* Since they are providing a metric_function, it seems
947  * reasonable to assume they want us to use it.
948  */
949  flags |= metricclass_flags::AUTO;
950  metricclass<T> rv(
951  cglue<metricclass<T> >::wrap(
952  metricclass_granularity_policy<T>::create(
953  tag.c_str(),
954  desc.size()
955  ? desc.c_str()
956  : /* NULL here will make codesonar crash, so don't
957  * do it */
958  tag.c_str(),
959  metricclass_func_ptr,
960  cglue<metricclass_flags>::unwrap(flags))));
961  metricclass_func_ptr->registered = true;
962  return rv;
963  }
964 
965  template <typename T>
966  inline metricclass<T> metricclass_manager<T>::create(
967  const std::string &tag,
968  const std::string &desc,
969  metricclass_flags flags)
970  {
971  /* Since there is no metric_function, it can't be auto. */
972  flags &= ~metricclass_flags::AUTO;
973  metricclass<T> rv(
974  cglue<metricclass<T> >::wrap(
975  metricclass_granularity_policy<T>::create(
976  tag.c_str(),
977  desc.size()
978  ? desc.c_str()
979  : /* NULL here will make codesonar crash, so don't
980  * do it */
981  tag.c_str(),
982  NULL,
983  cglue<metricclass_flags>::unwrap(flags))));
984  return rv;
985  }
986 
987  template <typename T>
988  inline iterator_adapter<metricclass_iterator_policy<T> >
989  metricclass_manager<T>::metricclasses()
990  {
991  return iterator_adapter<metricclass_iterator_policy<T> >(
992  /* template demands a container */42);
993  }
994 
995 
996 #ifdef SWIG
997 }
998 #define CS_SWIG_METRICCLASS_TEMPLATES(elt) \
999  %template(elt ## _metricclass_iterator_mixin) cs::iterator_adapter_mixin<cs::metricclass_iterator_policy<cs::elt> >; \
1000  %template(elt ## _metricclass_iterator) cs::iterator_adapter<cs::metricclass_iterator_policy<cs::elt> >
1001 
1002 CS_SWIG_METRICCLASS_TEMPLATES(project);
1003 CS_SWIG_METRICCLASS_TEMPLATES(compunit);
1004 CS_SWIG_METRICCLASS_TEMPLATES(sfile);
1005 CS_SWIG_METRICCLASS_TEMPLATES(procedure);
1006 
1007 #undef CS_SWIG_METRICCLASS_TEMPLATES
1008 namespace cs {
1009 #else
1010 
1011  typedef iterator_adapter<metricclass_iterator_policy<project> >
1013 
1014  typedef iterator_adapter<metricclass_iterator_policy<compunit> >
1016 
1017  typedef iterator_adapter<metricclass_iterator_policy<sfile> >
1019 
1020  typedef iterator_adapter<metricclass_iterator_policy<procedure> >
1022 
1025  DOX_METRICCLASS_TYPEDEFS(project)
1026 
1027 
1032  DOX_METRICCLASS_TYPEDEFS(compunit)
1033  DOX_METRICCLASS_TYPEDEFS(sfile)
1034 
1035 
1047  DOX_METRICCLASS_TYPEDEFS(procedure)
1048 
1049 #endif
1051  }
1052 
1053 #undef DOX_METRICCLASS_TYPEDEFS
1054 
1055 #endif /* CS_METRICCLASS_HPP */
Manages the sfile granularity metric classes (sfile_metricclass) associated with an analysis...
Definition: csonar_metricclass.hpp:1133
Namespace for CodeSonar/CodeSurfer API.
Definition: cs_ast.hpp:33
Iterator over the compunit-granularity metric classes (compunit_metricclass) managed by a compunit_me...
Definition: csonar_metricclass.hpp:1087
A compunit granularity metric class.
Definition: csonar_metricclass.hpp:1102
A CodeSonar or CodeSurfer project.
Definition: cs_project.hpp:392
cs::metricclass::description
std::string description() const
Get the description (longer, human readable identifier) for a metric class (metricclass).
Definition: csonar_metricclass.hpp:617
Iterator over the sfile-granularity metric classes (sfile_metricclass) managed by a sfile_metricclass...
Definition: csonar_metricclass.hpp:1118
cs::metricclass_manager::lookup
static metricclass< T > lookup(const std::string &tag)
Get the metricclass<T> that has the specified tag.
Definition: csonar_metricclass.hpp:938
cs::metricclass_granularity_policy
Definition: cs_types.hpp:377
cs::metricclass::report
void report(T elt, double val) const
Report a metric value to the hub.
Definition: csonar_metricclass.hpp:716
A sfile granularity metric class.
Definition: csonar_metricclass.hpp:1133
static const metricclass_flags POST_ANALYSIS
Singleton set containing the "post-analysis" flag: this metric relies on data from the analysis and s...
Definition: csonar_metricclass.hpp:125
A single procedure/function/method.
Definition: cs_procedure_decl.hpp:173
cs::metricclass::allowed
bool allowed() const
Check: are METRIC_FILTER settings such that reported instances of this metric class will be submitted...
Definition: csonar_metricclass.hpp:661
Manages the project granularity metric classes (project_metricclass) associated with an analysis...
Definition: csonar_metricclass.hpp:1065
static const metricclass_flags AUTO
Singleton set containing the "auto" flag: automatically compute values for this metric.
Definition: csonar_metricclass.hpp:83
cs::metricclass::tag
std::string tag() const
Get the tag (short string identifier) for a metric class (metricclass).
Definition: csonar_metricclass.hpp:600
cs::metricclass_manager::metricclasses
static iterator_adapter< metricclass_iterator_policy< T > > metricclasses()
Get an iterator over the metric classes (metricclass<T>) in a metricclass_manager<T>.
Definition: csonar_metricclass.hpp:999
Manages the compunit granularity metric classes (compunit_metricclass) associated with an analysis...
Definition: csonar_metricclass.hpp:1102
cs::metricclass_manager
Manages the metric classes of granularity T (metricclass<T>) for an analysis.
Definition: cs_iterator_adapter.hpp:47
cs::metricclass::as_repr
std::string as_repr() const
Get a representation of a metricclass object that includes information useful for debugging...
Definition: csonar_metricclass.hpp:579
Flag class: characterizes a metric class (procedure_metricclass, sfile_metricclass, compunit_metricclass, project_metricclass).
Definition: csonar_metricclass.hpp:62
A project granularity metric class.
Definition: csonar_metricclass.hpp:1065
cs::metricclass::retract
void retract(T elt) const
Retract a metric value.
Definition: csonar_metricclass.hpp:790
A source file.
Definition: cs_sfile_decl.hpp:98
cs::metricclass_iterator_policy< project >
Iterator over the project-granularity metric classes (project_metricclass) managed by a project_metri...
Definition: csonar_metricclass.hpp:1050
cs::metricclass::always_discarded
bool always_discarded() const
Check: are METRIC_FILTER settings such that instances of this metric class will always be ignored...
Definition: csonar_metricclass.hpp:639
Manages the procedure granularity metric classes (procedure_metricclass) associated with an analysis...
Definition: csonar_metricclass.hpp:1177
cs::metricclass_granularity_policy< project >
Definition: csonar_metricclass.hpp:302
cs::metricclass_manager::create
static metricclass< T > create(metric_function< T > *metricclass_func_ptr, const std::string &tag, const std::string &desc, metricclass_flags flags=metricclass_flags::AUTO)
Create and return a new metricclass<T>, specifying a computation function.
Definition: csonar_metricclass.hpp:950
cs::metricclass::value
double value(T elt) const
Get the value of a metric.
Definition: csonar_metricclass.hpp:756
static const metricclass_flags NONE
Empty set: contains no flags.
Definition: csonar_metricclass.hpp:73
cs::metricclass::flags
metricclass_flags flags() const
Get the metricclass_flags for a metricclass.
Definition: csonar_metricclass.hpp:801
cs::iterator_adapter
Iterator class template.
Definition: cs_iterator_adapter.hpp:65
cs::metricclass
A metric class.
Definition: cs_types.hpp:375
static project current()
Get the currently-loaded project.
Definition: cs_project.hpp:447
cs::metricclass::as_string
std::string as_string() const
Get a simple string representation of a metricclass object.
Definition: csonar_metricclass.hpp:572
A compilation unit.
Definition: cs_compunit_decl.hpp:70
Iterator over the procedure-granularity metric classes (procedure_metricclass) managed by a procedure...
Definition: csonar_metricclass.hpp:1162
A procedure granularity metric class.
Definition: csonar_metricclass.hpp:1177
The calculation function for a metric class.
Definition: cs_metric.hpp:510