Coverage Report

Created: 2023-12-08 06:53

/src/freeimage-svn/FreeImage/trunk/Source/OpenEXR/IlmImf/ImfHeader.h
Line
Count
Source (jump to first uncovered line)
1
///////////////////////////////////////////////////////////////////////////
2
//
3
// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas
4
// Digital Ltd. LLC
5
// 
6
// All rights reserved.
7
// 
8
// Redistribution and use in source and binary forms, with or without
9
// modification, are permitted provided that the following conditions are
10
// met:
11
// *       Redistributions of source code must retain the above copyright
12
// notice, this list of conditions and the following disclaimer.
13
// *       Redistributions in binary form must reproduce the above
14
// copyright notice, this list of conditions and the following disclaimer
15
// in the documentation and/or other materials provided with the
16
// distribution.
17
// *       Neither the name of Industrial Light & Magic nor the names of
18
// its contributors may be used to endorse or promote products derived
19
// from this software without specific prior written permission. 
20
// 
21
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
//
33
///////////////////////////////////////////////////////////////////////////
34
35
36
37
#ifndef INCLUDED_IMF_HEADER_H
38
#define INCLUDED_IMF_HEADER_H
39
40
//-----------------------------------------------------------------------------
41
//
42
//  class Header
43
//
44
//-----------------------------------------------------------------------------
45
46
#include "ImfLineOrder.h"
47
#include "ImfCompression.h"
48
#include "ImfName.h"
49
#include "ImfTileDescription.h"
50
#include "ImfInt64.h"
51
#include "ImathVec.h"
52
#include "ImathBox.h"
53
#include "IexBaseExc.h"
54
55
#include "ImfForward.h"
56
#include "ImfNamespace.h"
57
#include "ImfExport.h"
58
59
#include <map>
60
#include <iosfwd>
61
#include <string>
62
63
64
OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER
65
66
using std::string;
67
68
69
class IMF_EXPORT Header
70
{
71
  public:
72
    
73
    //----------------------------------------------------------------
74
    // Default constructor -- the display window and the data window
75
    // are both set to Box2i (V2i (0, 0), V2i (width-1, height-1).
76
    //----------------------------------------------------------------
77
78
    Header (int width = 64,
79
      int height = 64,
80
      float pixelAspectRatio = 1,
81
      const IMATH_NAMESPACE::V2f &screenWindowCenter = IMATH_NAMESPACE::V2f (0, 0),
82
      float screenWindowWidth = 1,
83
      LineOrder lineOrder = INCREASING_Y,
84
      Compression = ZIP_COMPRESSION);
85
86
87
    //--------------------------------------------------------------------
88
    // Constructor -- the data window is specified explicitly; the display
89
    // window is set to Box2i (V2i (0, 0), V2i (width-1, height-1).
90
    //--------------------------------------------------------------------
91
92
    Header (int width,
93
      int height,
94
      const IMATH_NAMESPACE::Box2i &dataWindow,
95
      float pixelAspectRatio = 1,
96
      const IMATH_NAMESPACE::V2f &screenWindowCenter = IMATH_NAMESPACE::V2f (0, 0),
97
      float screenWindowWidth = 1,
98
      LineOrder lineOrder = INCREASING_Y,
99
      Compression = ZIP_COMPRESSION);
100
101
102
    //----------------------------------------------------------
103
    // Constructor -- the display window and the data window are
104
    // both specified explicitly.
105
    //----------------------------------------------------------
106
107
    Header (const IMATH_NAMESPACE::Box2i &displayWindow,
108
      const IMATH_NAMESPACE::Box2i &dataWindow,
109
      float pixelAspectRatio = 1,
110
      const IMATH_NAMESPACE::V2f &screenWindowCenter = IMATH_NAMESPACE::V2f (0, 0),
111
      float screenWindowWidth = 1,
112
      LineOrder lineOrder = INCREASING_Y,
113
      Compression = ZIP_COMPRESSION);
114
115
116
    //-----------------
117
    // Copy constructor
118
    //-----------------
119
120
    Header (const Header &other);
121
122
123
    //-----------
124
    // Destructor
125
    //-----------
126
127
    ~Header ();
128
129
130
    //-----------
131
    // Assignment
132
    //-----------
133
134
    Header &      operator = (const Header &other);
135
136
137
    //---------------------------------------------------------------
138
    // Add an attribute:
139
    //
140
    // insert(n,attr) If no attribute with name n exists, a new
141
    //      attribute with name n, and the same type as
142
    //      attr, is added, and the value of attr is
143
    //      copied into the new attribute.
144
    //
145
    //      If an attribute with name n exists, and its
146
    //      type is the same as attr, the value of attr
147
    //      is copied into this attribute.
148
    //
149
    //      If an attribute with name n exists, and its
150
    //      type is different from attr, an IEX_NAMESPACE::TypeExc
151
    //      is thrown.
152
    //
153
    //---------------------------------------------------------------
154
155
    void      insert (const char name[],
156
                const Attribute &attribute);
157
158
    void      insert (const std::string &name,
159
                const Attribute &attribute);
160
161
    //---------------------------------------------------------------
162
    // Remove an attribute:
163
    //
164
    // remove(n)       If an attribute with name n exists, then it
165
    //                 is removed from the map of present attributes.
166
    //
167
    //                 If no attribute with name n exists, then this
168
    //                 functions becomes a 'no-op'
169
    //
170
    //---------------------------------------------------------------
171
    void                        erase (const char name[]);
172
    void                        erase (const std::string &name);
173
174
    
175
    
176
    //------------------------------------------------------------------
177
    // Access to existing attributes:
178
    //
179
    // [n]      Returns a reference to the attribute
180
    //        with name n.  If no attribute with
181
    //        name n exists, an IEX_NAMESPACE::ArgExc is thrown.
182
    //
183
    // typedAttribute<T>(n) Returns a reference to the attribute
184
    //        with name n and type T.  If no attribute
185
    //        with name n exists, an IEX_NAMESPACE::ArgExc is
186
    //        thrown.  If an attribute with name n
187
    //        exists, but its type is not T, an
188
    //        IEX_NAMESPACE::TypeExc is thrown.
189
    //
190
    // findTypedAttribute<T>(n) Returns a pointer to the attribute with
191
    //        name n and type T, or 0 if no attribute
192
    //        with name n and type T exists.
193
    //
194
    //------------------------------------------------------------------
195
196
    Attribute &     operator [] (const char name[]);
197
    const Attribute &   operator [] (const char name[]) const;
198
199
    Attribute &     operator [] (const std::string &name);
200
    const Attribute &   operator [] (const std::string &name) const;
201
202
    template <class T> T& typedAttribute (const char name[]);
203
    template <class T> const T& typedAttribute (const char name[]) const;
204
205
    template <class T> T& typedAttribute (const std::string &name);
206
    template <class T> const T& typedAttribute (const std::string &name) const;
207
208
    template <class T> T* findTypedAttribute (const char name[]);
209
    template <class T> const T* findTypedAttribute (const char name[]) const;
210
211
    template <class T> T* findTypedAttribute (const std::string &name);
212
    template <class T> const T* findTypedAttribute (const std::string &name)
213
                       const;
214
215
    //---------------------------------------------
216
    // Iterator-style access to existing attributes
217
    //---------------------------------------------
218
219
    typedef std::map <Name, Attribute *> AttributeMap;
220
221
    class Iterator;
222
    class ConstIterator;
223
224
    Iterator      begin ();
225
    ConstIterator   begin () const;
226
227
    Iterator      end ();
228
    ConstIterator   end () const;
229
230
    Iterator      find (const char name[]);
231
    ConstIterator   find (const char name[]) const;
232
233
    Iterator      find (const std::string &name);
234
    ConstIterator   find (const std::string &name) const;
235
236
237
    //--------------------------------
238
    // Access to predefined attributes
239
    //--------------------------------
240
241
    IMATH_NAMESPACE::Box2i &    displayWindow ();
242
    const IMATH_NAMESPACE::Box2i &  displayWindow () const;
243
244
    IMATH_NAMESPACE::Box2i &    dataWindow ();
245
    const IMATH_NAMESPACE::Box2i &  dataWindow () const;
246
247
    float &     pixelAspectRatio ();
248
    const float &   pixelAspectRatio () const;
249
250
    IMATH_NAMESPACE::V2f &    screenWindowCenter ();
251
    const IMATH_NAMESPACE::V2f &    screenWindowCenter () const;
252
253
    float &     screenWindowWidth ();
254
    const float &   screenWindowWidth () const;
255
256
    ChannelList &   channels ();
257
    const ChannelList &   channels () const;
258
259
    LineOrder &     lineOrder ();
260
    const LineOrder &   lineOrder () const;
261
262
    Compression &   compression ();
263
    const Compression &   compression () const;
264
265
266
    //-----------------------------------------------------
267
    // Access to required attributes for multipart files
268
    // They are optional to non-multipart files and mandatory
269
    // for multipart files.
270
    //-----------------------------------------------------
271
    void                        setName (const string& name);
272
273
    string&                     name();
274
    const string&               name() const;
275
276
    bool                        hasName() const;
277
278
    void                        setType (const string& Type);
279
280
    string&                     type();
281
    const string&               type() const;
282
283
    bool                        hasType() const;
284
285
    void                        setVersion (const int version);
286
287
    int&                        version();
288
    const int&                  version() const;
289
290
    bool                        hasVersion() const;
291
292
    //
293
    // the chunkCount attribute is set automatically when a file is written.
294
    // There is no need to set it manually
295
    //
296
    void                        setChunkCount(int chunks);
297
    bool                        hasChunkCount() const;
298
    const int &                 chunkCount() const;
299
    int &                       chunkCount();
300
301
    
302
    //
303
    // for multipart files, return whether the file has a view string attribute
304
    // (for the deprecated single part multiview format EXR, see ImfMultiView.h)
305
    //
306
    void                       setView(const string & view);
307
    bool                       hasView() const;
308
    string &                   view();
309
    const string &             view() const;
310
    
311
312
    //----------------------------------------------------------------------
313
    // Tile Description:
314
    //
315
    // The tile description is a TileDescriptionAttribute whose name
316
    // is "tiles".  The "tiles" attribute must be present in any tiled
317
    // image file. When present, it describes various properties of the
318
    // tiles that make up the file.
319
    //
320
    // Convenience functions:
321
    //
322
    // setTileDescription(td)
323
    //     calls insert ("tiles", TileDescriptionAttribute (td))
324
    //
325
    // tileDescription()
326
    //     returns typedAttribute<TileDescriptionAttribute>("tiles").value()
327
    //
328
    // hasTileDescription()
329
    //     return findTypedAttribute<TileDescriptionAttribute>("tiles") != 0
330
    //
331
    //----------------------------------------------------------------------
332
333
    void      setTileDescription (const TileDescription & td);
334
335
    TileDescription &   tileDescription ();
336
    const TileDescription & tileDescription () const;
337
338
    bool      hasTileDescription() const;
339
340
341
    //----------------------------------------------------------------------
342
    // Preview image:
343
    //
344
    // The preview image is a PreviewImageAttribute whose name is "preview".
345
    // This attribute is special -- while an image file is being written,
346
    // the pixels of the preview image can be changed repeatedly by calling
347
    // OutputFile::updatePreviewImage().
348
    //
349
    // Convenience functions:
350
    //
351
    // setPreviewImage(p)
352
    //     calls insert ("preview", PreviewImageAttribute (p))
353
    //
354
    // previewImage()
355
    //     returns typedAttribute<PreviewImageAttribute>("preview").value()
356
    //
357
    // hasPreviewImage()
358
    //     return findTypedAttribute<PreviewImageAttribute>("preview") != 0
359
    //
360
    //----------------------------------------------------------------------
361
362
    void      setPreviewImage (const PreviewImage &p);
363
364
    PreviewImage &    previewImage ();
365
    const PreviewImage &  previewImage () const;
366
367
    bool      hasPreviewImage () const;
368
369
370
    //-------------------------------------------------------------
371
    // Sanity check -- examines the header, and throws an exception
372
    // if it finds something wrong (empty display window, negative
373
    // pixel aspect ratio, unknown compression sceme etc.)
374
    //
375
    // set isTiled to true if you are checking a tiled/multi-res
376
    // header
377
    //-------------------------------------------------------------
378
379
    void      sanityCheck (bool isTiled = false,
380
                           bool isMultipartFile = false) const;
381
382
383
    //----------------------------------------------------------------
384
    // Maximum image size and maximim tile size:
385
    //
386
    // sanityCheck() will throw an exception if the width or height of
387
    // the data window exceeds the maximum image width or height, or
388
    // if the size of a tile exceeds the maximum tile width or height.
389
    // 
390
    // At program startup the maximum image and tile width and height
391
    // are set to zero, meaning that width and height are unlimited.
392
    //
393
    // Limiting image and tile width and height limits how much memory
394
    // will be allocated when a file is opened.  This can help protect
395
    // applications from running out of memory while trying to read
396
    // a damaged image file.
397
    //----------------------------------------------------------------
398
399
    static void     setMaxImageSize (int maxWidth, int maxHeight);
400
    static void     setMaxTileSize (int maxWidth, int maxHeight);
401
402
    //
403
    // Check if the header reads nothing.
404
    //
405
    bool                        readsNothing();
406
407
408
    //------------------------------------------------------------------
409
    // Input and output:
410
    //
411
    // If the header contains a preview image attribute, then writeTo()
412
    // returns the position of that attribute in the output stream; this
413
    // information is used by OutputFile::updatePreviewImage().
414
    // If the header contains no preview image attribute, then writeTo()
415
    // returns 0.
416
    //------------------------------------------------------------------
417
418
419
    Int64     writeTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os,
420
           bool isTiled = false) const;
421
422
    void      readFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is,
423
                        int &version);
424
    
425
426
  private:
427
428
    AttributeMap    _map;
429
430
    bool                        _readsNothing;
431
};
432
433
434
//----------
435
// Iterators
436
//----------
437
438
class Header::Iterator
439
{
440
  public:
441
442
    Iterator ();
443
    Iterator (const Header::AttributeMap::iterator &i);
444
445
    Iterator &      operator ++ ();
446
    Iterator      operator ++ (int);
447
448
    const char *    name () const;
449
    Attribute &     attribute () const;
450
451
  private:
452
453
    friend class Header::ConstIterator;
454
455
    Header::AttributeMap::iterator _i;
456
};
457
458
459
class Header::ConstIterator
460
{
461
  public:
462
463
    ConstIterator ();
464
    ConstIterator (const Header::AttributeMap::const_iterator &i);
465
    ConstIterator (const Header::Iterator &other);
466
467
    ConstIterator &   operator ++ ();
468
    ConstIterator     operator ++ (int);
469
470
    const char *    name () const;
471
    const Attribute &   attribute () const;
472
473
  private:
474
475
    friend bool operator == (const ConstIterator &, const ConstIterator &);
476
    friend bool operator != (const ConstIterator &, const ConstIterator &);
477
478
    Header::AttributeMap::const_iterator _i;
479
};
480
481
482
//------------------------------------------------------------------------
483
// Library initialization:
484
//
485
// In a multithreaded program, staticInitialize() must be called once
486
// during startup, before the program accesses any other functions or
487
// classes in the IlmImf library.  Calling staticInitialize() in this
488
// way avoids races during initialization of the library's global
489
// variables.
490
//
491
// Single-threaded programs are not required to call staticInitialize();
492
// initialization of the library's global variables happens automatically.
493
//
494
//------------------------------------------------------------------------
495
496
void staticInitialize ();
497
498
499
//-----------------
500
// Inline Functions
501
//-----------------
502
503
504
inline
505
Header::Iterator::Iterator (): _i()
506
{
507
    // empty
508
}
509
510
511
inline
512
Header::Iterator::Iterator (const Header::AttributeMap::iterator &i): _i (i)
513
0
{
514
    // empty
515
0
}
516
517
518
inline Header::Iterator &   
519
Header::Iterator::operator ++ ()
520
0
{
521
0
    ++_i;
522
0
    return *this;
523
0
}
524
525
526
inline Header::Iterator   
527
Header::Iterator::operator ++ (int)
528
0
{
529
0
    Iterator tmp = *this;
530
0
    ++_i;
531
0
    return tmp;
532
0
}
533
534
535
inline const char *
536
Header::Iterator::name () const
537
0
{
538
0
    return *_i->first;
539
0
}
540
541
542
inline Attribute &  
543
Header::Iterator::attribute () const
544
0
{
545
0
    return *_i->second;
546
0
}
547
548
549
inline
550
Header::ConstIterator::ConstIterator (): _i()
551
{
552
    // empty
553
}
554
555
inline
556
Header::ConstIterator::ConstIterator
557
    (const Header::AttributeMap::const_iterator &i): _i (i)
558
0
{
559
    // empty
560
0
}
561
562
563
inline
564
Header::ConstIterator::ConstIterator (const Header::Iterator &other):
565
    _i (other._i)
566
{
567
    // empty
568
}
569
570
inline Header::ConstIterator &
571
Header::ConstIterator::operator ++ ()
572
0
{
573
0
    ++_i;
574
0
    return *this;
575
0
}
576
577
578
inline Header::ConstIterator    
579
Header::ConstIterator::operator ++ (int)
580
0
{
581
0
    ConstIterator tmp = *this;
582
0
    ++_i;
583
0
    return tmp;
584
0
}
585
586
587
inline const char *
588
Header::ConstIterator::name () const
589
0
{
590
0
    return *_i->first;
591
0
}
592
593
594
inline const Attribute &  
595
Header::ConstIterator::attribute () const
596
0
{
597
0
    return *_i->second;
598
0
}
599
600
601
inline bool
602
operator == (const Header::ConstIterator &x, const Header::ConstIterator &y)
603
0
{
604
0
    return x._i == y._i;
605
0
}
606
607
608
inline bool
609
operator != (const Header::ConstIterator &x, const Header::ConstIterator &y)
610
0
{
611
0
    return !(x == y);
612
0
}
613
614
615
//---------------------
616
// Template definitions
617
//---------------------
618
619
template <class T>
620
T &
621
Header::typedAttribute (const char name[])
622
0
{
623
0
    Attribute *attr = &(*this)[name];
624
0
    T *tattr = dynamic_cast <T*> (attr);
625
626
0
    if (tattr == 0)
627
0
  throw IEX_NAMESPACE::TypeExc ("Unexpected attribute type.");
628
629
0
    return *tattr;
630
0
}
Unexecuted instantiation: Imf_2_2::TypedAttribute<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >(char const*)
Unexecuted instantiation: Imf_2_2::TypedAttribute<int>& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<int> >(char const*)
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imf_2_2::TileDescription>& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<Imf_2_2::TileDescription> >(char const*)
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imf_2_2::PreviewImage>& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<Imf_2_2::PreviewImage> >(char const*)
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imf_2_2::Chromaticities>& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<Imf_2_2::Chromaticities> >(char const*)
Unexecuted instantiation: Imf_2_2::TypedAttribute<float>& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<float> >(char const*)
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imath_2_2::Vec2<float> >& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<Imath_2_2::Vec2<float> > >(char const*)
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imf_2_2::Envmap>& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<Imf_2_2::Envmap> >(char const*)
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imf_2_2::KeyCode>& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<Imf_2_2::KeyCode> >(char const*)
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imf_2_2::TimeCode>& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<Imf_2_2::TimeCode> >(char const*)
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imf_2_2::Rational>& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<Imf_2_2::Rational> >(char const*)
Unexecuted instantiation: Imf_2_2::TypedAttribute<std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > > >(char const*)
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imath_2_2::Matrix44<float> >& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<Imath_2_2::Matrix44<float> > >(char const*)
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imf_2_2::DeepImageState>& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<Imf_2_2::DeepImageState> >(char const*)
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imath_2_2::Box<Imath_2_2::Vec2<int> > >& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<Imath_2_2::Box<Imath_2_2::Vec2<int> > > >(char const*)
631
632
633
template <class T>
634
const T &
635
Header::typedAttribute (const char name[]) const
636
0
{
637
0
    const Attribute *attr = &(*this)[name];
638
0
    const T *tattr = dynamic_cast <const T*> (attr);
639
640
0
    if (tattr == 0)
641
0
  throw IEX_NAMESPACE::TypeExc ("Unexpected attribute type.");
642
643
0
    return *tattr;
644
0
}
Unexecuted instantiation: Imf_2_2::TypedAttribute<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > const& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<int> const& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<int> >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imf_2_2::TileDescription> const& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<Imf_2_2::TileDescription> >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imf_2_2::PreviewImage> const& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<Imf_2_2::PreviewImage> >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imf_2_2::Chromaticities> const& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<Imf_2_2::Chromaticities> >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<float> const& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<float> >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imath_2_2::Vec2<float> > const& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<Imath_2_2::Vec2<float> > >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imf_2_2::Envmap> const& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<Imf_2_2::Envmap> >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imf_2_2::KeyCode> const& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<Imf_2_2::KeyCode> >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imf_2_2::TimeCode> const& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<Imf_2_2::TimeCode> >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imf_2_2::Rational> const& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<Imf_2_2::Rational> >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > > const& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > > >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imath_2_2::Matrix44<float> > const& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<Imath_2_2::Matrix44<float> > >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imf_2_2::DeepImageState> const& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<Imf_2_2::DeepImageState> >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imath_2_2::Box<Imath_2_2::Vec2<int> > > const& Imf_2_2::Header::typedAttribute<Imf_2_2::TypedAttribute<Imath_2_2::Box<Imath_2_2::Vec2<int> > > >(char const*) const
645
646
647
template <class T>
648
T &
649
Header::typedAttribute (const std::string &name)
650
{
651
    return typedAttribute<T> (name.c_str());
652
}
653
654
655
template <class T>
656
const T &
657
Header::typedAttribute (const std::string &name) const
658
{
659
    return typedAttribute<T> (name.c_str());
660
}
661
662
663
template <class T>
664
T *
665
Header::findTypedAttribute (const char name[])
666
{
667
    AttributeMap::iterator i = _map.find (name);
668
    return (i == _map.end())? 0: dynamic_cast <T*> (i->second);
669
}
670
671
672
template <class T>
673
const T *
674
Header::findTypedAttribute (const char name[]) const
675
0
{
676
0
    AttributeMap::const_iterator i = _map.find (name);
677
0
    return (i == _map.end())? 0: dynamic_cast <const T*> (i->second);
678
0
}
Unexecuted instantiation: Imf_2_2::TypedAttribute<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > const* Imf_2_2::Header::findTypedAttribute<Imf_2_2::TypedAttribute<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<int> const* Imf_2_2::Header::findTypedAttribute<Imf_2_2::TypedAttribute<int> >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imf_2_2::TileDescription> const* Imf_2_2::Header::findTypedAttribute<Imf_2_2::TypedAttribute<Imf_2_2::TileDescription> >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imf_2_2::PreviewImage> const* Imf_2_2::Header::findTypedAttribute<Imf_2_2::TypedAttribute<Imf_2_2::PreviewImage> >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imf_2_2::TimeCode> const* Imf_2_2::Header::findTypedAttribute<Imf_2_2::TypedAttribute<Imf_2_2::TimeCode> >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imf_2_2::Chromaticities> const* Imf_2_2::Header::findTypedAttribute<Imf_2_2::TypedAttribute<Imf_2_2::Chromaticities> >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<float> const* Imf_2_2::Header::findTypedAttribute<Imf_2_2::TypedAttribute<float> >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imath_2_2::Vec2<float> > const* Imf_2_2::Header::findTypedAttribute<Imf_2_2::TypedAttribute<Imath_2_2::Vec2<float> > >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imf_2_2::Envmap> const* Imf_2_2::Header::findTypedAttribute<Imf_2_2::TypedAttribute<Imf_2_2::Envmap> >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imf_2_2::KeyCode> const* Imf_2_2::Header::findTypedAttribute<Imf_2_2::TypedAttribute<Imf_2_2::KeyCode> >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imf_2_2::Rational> const* Imf_2_2::Header::findTypedAttribute<Imf_2_2::TypedAttribute<Imf_2_2::Rational> >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > > const* Imf_2_2::Header::findTypedAttribute<Imf_2_2::TypedAttribute<std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > > >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imath_2_2::Matrix44<float> > const* Imf_2_2::Header::findTypedAttribute<Imf_2_2::TypedAttribute<Imath_2_2::Matrix44<float> > >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imf_2_2::DeepImageState> const* Imf_2_2::Header::findTypedAttribute<Imf_2_2::TypedAttribute<Imf_2_2::DeepImageState> >(char const*) const
Unexecuted instantiation: Imf_2_2::TypedAttribute<Imath_2_2::Box<Imath_2_2::Vec2<int> > > const* Imf_2_2::Header::findTypedAttribute<Imf_2_2::TypedAttribute<Imath_2_2::Box<Imath_2_2::Vec2<int> > > >(char const*) const
679
680
681
template <class T>
682
T *
683
Header::findTypedAttribute (const std::string &name)
684
{
685
    return findTypedAttribute<T> (name.c_str());
686
}
687
688
689
template <class T>
690
const T *
691
Header::findTypedAttribute (const std::string &name) const
692
{
693
    return findTypedAttribute<T> (name.c_str());
694
}
695
696
697
OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT
698
699
#endif