]> rtime.felk.cvut.cz Git - opencv.git/blob - opencv/include/opencv/cvinternal.h
modified parallel_reduce
[opencv.git] / opencv / include / opencv / cvinternal.h
1 /*M///////////////////////////////////////////////////////////////////////////////////////
2 //
3 //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4 //
5 //  By downloading, copying, installing or using the software you agree to this license.
6 //  If you do not agree to this license, do not download, install,
7 //  copy or use the software.
8 //
9 //
10 //                           License Agreement
11 //                For Open Source Computer Vision Library
12 //
13 // Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
14 // Copyright (C) 2009, Willow Garage Inc., all rights reserved.
15 // Third party copyrights are property of their respective owners.
16 //
17 // Redistribution and use in source and binary forms, with or without modification,
18 // are permitted provided that the following conditions are met:
19 //
20 //   * Redistribution's of source code must retain the above copyright notice,
21 //     this list of conditions and the following disclaimer.
22 //
23 //   * Redistribution's in binary form must reproduce the above copyright notice,
24 //     this list of conditions and the following disclaimer in the documentation
25 //     and/or other materials provided with the distribution.
26 //
27 //   * The name of the copyright holders may not be used to endorse or promote products
28 //     derived from this software without specific prior written permission.
29 //
30 // This software is provided by the copyright holders and contributors "as is" and
31 // any express or implied warranties, including, but not limited to, the implied
32 // warranties of merchantability and fitness for a particular purpose are disclaimed.
33 // In no event shall the Intel Corporation or contributors be liable for any direct,
34 // indirect, incidental, special, exemplary, or consequential damages
35 // (including, but not limited to, procurement of substitute goods or services;
36 // loss of use, data, or profits; or business interruption) however caused
37 // and on any theory of liability, whether in contract, strict liability,
38 // or tort (including negligence or otherwise) arising in any way out of
39 // the use of this software, even if advised of the possibility of such damage.
40 //
41 //M*/
42
43 /* The header is for internal use and it is likely to change.
44    It contains some macro definitions that are used in cxcore, cv, cvaux
45    and, probably, other libraries. If you need some of this functionality,
46    the safe way is to copy it into your code and rename the macros.
47 */
48 #ifndef __OPENCV_INTERNAL_H__
49 #define __OPENCV_INTERNAL_H__
50
51 #include <vector>
52
53 #ifdef HAVE_CONFIG_H
54     #include <cvconfig.h>
55 #endif
56
57 #if defined WIN32 || defined _WIN32
58 #  ifndef WIN32
59 #    define WIN32
60 #  endif
61 #  ifndef _WIN32
62 #    define _WIN32
63 #  endif
64 #endif
65
66 #if defined WIN32 || defined WINCE
67 #ifndef _WIN32_WINNT         // This is needed for the declaration of TryEnterCriticalSection in winbase.h with Visual Studio 2005 (and older?)
68 #define _WIN32_WINNT 0x0400  // http://msdn.microsoft.com/en-us/library/ms686857(VS.85).aspx
69 #endif
70 #include <windows.h>
71 #undef small
72 #undef min
73 #undef max
74 #else
75 #include <pthread.h>
76 #include <sys/mman.h>
77 #endif
78
79 #ifdef __BORLANDC__
80 #ifndef WIN32
81     #define     WIN32
82 #endif
83 #ifndef _WIN32
84     #define     _WIN32
85 #endif
86     #define     CV_DLL
87     #undef      _CV_ALWAYS_PROFILE_
88     #define     _CV_ALWAYS_NO_PROFILE_
89 #endif
90
91 #ifndef FALSE
92 #define FALSE 0
93 #endif
94 #ifndef TRUE
95 #define TRUE 1
96 #endif
97
98 #define __BEGIN__ __CV_BEGIN__
99 #define __END__ __CV_END__
100 #define EXIT __CV_EXIT__
101
102 #ifdef HAVE_IPP
103 #include "ipp.h"
104
105 CV_INLINE IppiSize ippiSize(int width, int height)
106 {
107     IppiSize size = { width, height };
108     return size;
109 }
110 #endif
111
112 #if defined __SSE2__ || _MSC_VER >= 1300
113 #include "emmintrin.h"
114 #define CV_SSE 1
115 #define CV_SSE2 1
116 #if defined __SSE3__ || _MSC_VER >= 1400
117 #include "pmmintrin.h"
118 #define CV_SSE3 1
119 #endif
120 #else
121 #define CV_SSE 0
122 #define CV_SSE2 0
123 #define CV_SSE3 0
124 #endif
125
126 #ifndef IPPI_CALL
127 #define IPPI_CALL(func) CV_Assert((func) >= 0)
128 #endif
129
130 #ifdef HAVE_TBB
131     #include "tbb/tbb_stddef.h"
132     #if TBB_VERSION_MAJOR*100 + TBB_VERSION_MINOR >= 202
133         #include "tbb/tbb.h"
134         #undef min
135         #undef max
136     #else
137         #undef HAVE_TBB
138     #endif
139 #endif
140
141 #ifdef HAVE_TBB
142     namespace cv
143     {
144         typedef tbb::blocked_range<int> BlockedRange;
145         
146         template<typename Body> static inline
147         void parallel_for( const BlockedRange& range, const Body& body )
148         {
149             tbb::parallel_for(range, body);
150         }
151         
152         template<typename Iterator, typename Body> static inline
153         void parallel_do( Iterator first, Iterator last, const Body& body )
154         {
155             tbb::parallel_do(first, last, body);
156         }
157         
158         typedef tbb::split Split;
159         
160         template<typename Body> static inline
161         void parallel_reduce( const BlockedRange& range, Body& body )
162         {
163             tbb::parallel_reduce(range, body);
164         }
165         
166         typedef tbb::concurrent_vector<Rect> ConcurrentRectVector;
167     }
168 #else
169     namespace cv
170     {
171         class BlockedRange
172         {
173         public:
174             BlockedRange() : _begin(0), _end(0), _grainsize(0) {}
175             BlockedRange(int b, int e, int g=1) : _begin(b), _end(e), _grainsize(g) {}
176             int begin() const { return _begin; }
177             int end() const { return _end; }
178             int grainsize() const { return _grainsize; }
179             
180         protected:
181             int _begin, _end, _grainsize;
182         };
183
184         template<typename Body> static inline
185         void parallel_for( const BlockedRange& range, const Body& body )
186         {
187             body(range);
188         }
189         
190         template<typename Iterator, typename Body> static inline
191         void parallel_do( Iterator first, Iterator last, const Body& body )
192         {
193             for( ; first != last; ++first )
194                 body(*first);
195         }
196         
197         class Split {};
198         
199         template<typename Body> static inline
200         void parallel_reduce( const BlockedRange& range, Body& body )
201         {
202             body(range);
203         }
204         
205         typedef std::vector<Rect> ConcurrentRectVector;
206     }
207 #endif
208
209 #endif