summaryrefslogtreecommitdiff
path: root/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/findmet.hh
blob: 542ed6dddc6beee5c45375b2fe8f39d2dc939cdb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// -*- related-file-name: "../../libefont/findmet.cc" -*-
#ifndef EFONT_FINDMET_HH
#define EFONT_FINDMET_HH
#include <lcdf/hashmap.hh>
#include <lcdf/vector.hh>
#include <lcdf/permstr.hh>
class Filename;
class ErrorHandler;
namespace Efont {
class Metrics;
class AmfmMetrics;
class PsresDatabase;

class MetricsFinder { public:

    MetricsFinder()                     : _next(0), _prev(0) { }
    virtual ~MetricsFinder();

    MetricsFinder *next() const         { return _next; }

    void add_finder(MetricsFinder *);

    Metrics *find_metrics(PermString, ErrorHandler * = 0);
    AmfmMetrics *find_amfm(PermString, ErrorHandler * = 0);

    virtual Metrics *find_metrics_x(PermString, MetricsFinder *, ErrorHandler *);
    virtual AmfmMetrics *find_amfm_x(PermString, MetricsFinder *, ErrorHandler *);

    void record(Metrics *m);
    virtual void record(Metrics *, PermString);
    virtual void record(AmfmMetrics *);

  private:

    MetricsFinder *_next;
    MetricsFinder *_prev;

    MetricsFinder(const MetricsFinder &)                        { }
    MetricsFinder &operator=(const MetricsFinder &)     { return *this; }

  protected:

    Metrics *try_metrics_file(const Filename &, MetricsFinder *, ErrorHandler *);
    AmfmMetrics *try_amfm_file(const Filename &, MetricsFinder *, ErrorHandler *);

};


class CacheMetricsFinder: public MetricsFinder { public:

    CacheMetricsFinder();
    ~CacheMetricsFinder();

    Metrics *find_metrics_x(PermString, MetricsFinder *, ErrorHandler *);
    AmfmMetrics *find_amfm_x(PermString, MetricsFinder *, ErrorHandler *);
    void record(Metrics *, PermString);
    void record(AmfmMetrics *);

    void clear();

  private:

    HashMap<PermString, int> _metrics_map;
    Vector<Metrics *> _metrics;
    HashMap<PermString, int> _amfm_map;
    Vector<AmfmMetrics *> _amfm;

};


class InstanceMetricsFinder: public MetricsFinder { public:

    InstanceMetricsFinder(bool call_mmpfb = true);

    Metrics *find_metrics_x(PermString, MetricsFinder *, ErrorHandler *);

  private:

    bool _call_mmpfb;

    Metrics *find_metrics_instance(PermString, MetricsFinder *, ErrorHandler *);

};


class PsresMetricsFinder: public MetricsFinder { public:

    PsresMetricsFinder(PsresDatabase *);

    Metrics *find_metrics_x(PermString, MetricsFinder *, ErrorHandler *);
    AmfmMetrics *find_amfm_x(PermString, MetricsFinder *, ErrorHandler *);

  private:

    PsresDatabase *_psres;

};


class DirectoryMetricsFinder: public MetricsFinder { public:

    DirectoryMetricsFinder(PermString);

    Metrics *find_metrics_x(PermString, MetricsFinder *, ErrorHandler *);
    AmfmMetrics *find_amfm_x(PermString, MetricsFinder *, ErrorHandler *);

  private:

    PermString _directory;

};

}
#endif