Files
secondo/Algebras/GeneralTree/BBoxReg.h
2026-01-23 17:03:45 +08:00

308 lines
7.8 KiB
C++

/*
\newpage
----
This file is part of SECONDO.
Copyright (C) 2004, University in Hagen, Department of Computer Science,
Database Systems for New Applications.
SECONDO is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
SECONDO is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with SECONDO; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
----
//[_] [\_]
//characters [1] verbatim: [$] [$]
//characters [2] formula: [$] [$]
//characters [3] capital: [\textsc{] [}]
//characters [4] teletype: [\texttt{] [}]
1.1 Headerfile "BBoxReg.h"[4]
January-May 2008, Mirko Dibbert
This file contains all defined getbbox functions. New functions must be registered in the\\
"BBoxReg::initialize"[4] method.
1.1.1 Includes and defines
*/
#ifndef __BBOX_REG_H__
#define __BBOX_REG_H__
#include "SecondoInterface.h"
#include "Symbols.h"
#include "TypeConstructor.h"
#include "Algebras/Rectangle/RectangleAlgebra.h"
#include "GTA_SpatialAttr.h"
namespace gta
{
typedef HRect* (*GetBBoxFun)(const void *data);
/*
Refers the default getbbox function for the each type constructor.
*/
const std::string BBOX_DEFAULT("default");
/*
This value is returned from "BBoxReg::defaultName()"[4], if no default getbbox function has been found for the resp. type constructor.
*/
const std::string BBOX_UNDEFINED("n/a");
/////////////////////////////////////////////////////////////////////
// constants for the getbbox function names:
/////////////////////////////////////////////////////////////////////
// native getbbox function (e.g. used if only one fun is defined)
const std::string BBOX_NATIVE("native");
/////////////////////////////////////////////////////////////////////
// Flags for the BBoxInfo class:
/////////////////////////////////////////////////////////////////////
// this flag is set for all defined info objects
// (will automatically assigned from the constructor)
const char BBOX_IS_DEFINED = (1 << 0);
// if set, the info object will be used as default for the resp. type
// constructor (if more than one info object for the same type
// constructor is specified as default, the least added one will be
// used)
const char BBOX_IS_DEFAULT = (1 << 1);
/********************************************************************
1.1.1 Class ~BBoxInfo~
This class stores a pointer to a getbbox function together with the function name.
********************************************************************/
class BBoxInfo
{
public:
/*
Default constructor (creates an undefined info object)
*/
inline BBoxInfo()
: m_name("undef"), m_getbboxFun(0), m_flags(0)
{}
/*
Constructor (creates a new info object with the given values)
*/
inline BBoxInfo(
const std::string &name,
const std::string &typeName,
const GetBBoxFun getbbox_Fun,
char flags = 0)
: m_name(name), m_getbboxFun(getbbox_Fun),
m_flags(BBOX_IS_DEFINED | flags)
{ static SecondoCatalog* ctlg = SecondoSystem::GetCatalog();
ctlg->GetTypeId(typeName, m_algebraId, m_typeId); }
/*
Returns the name of the assigned getbbox function.
*/
inline std::string name() const
{ return m_name; }
/*
Returns the assigned getbbox function.
*/
inline GetBBoxFun getBBoxFun() const
{ return m_getbboxFun; }
/*
Generates a new "HRect"[4] object with the assigned getbbox function from "attr"[4].
*/
inline HRect* getBBox(const void *attr) const
{ return m_getbboxFun(attr); }
/*
Returns the id of the assigned type constructor.
*/
inline int typeId() const
{ return m_typeId; }
/*
Returns the name of the assigned type constructor.
*/
inline std::string typeName() const
{ return am->GetTC(m_algebraId, m_typeId)->Name(); }
/*
Returns the id of the assigned algebra.
*/
inline int algebraId() const
{ return m_algebraId; }
/*
Returns the name of the assigned algebra.
*/
inline std::string algebraName() const
{ return am->GetAlgebraName(m_algebraId); }
/*
Returns "true"[4], if the "BBoxInfo"[4] object is defined (should only be "false"[4], if a requested getbbox function could not be found in the "BBoxReg"[4] class).
*/
inline bool isDefined() const
{ return (m_flags & BBOX_IS_DEFINED); }
/*
Returns "true"[4], if the info object is the default info object for the respective type constructor.
*/
inline bool isDefault() const
{ return (m_flags & BBOX_IS_DEFAULT); }
private:
std::string m_name; // unique name (used for selection)
int m_algebraId; // algebra-id of the assigned type constructor
int m_typeId; // type-id of the assigned type constructor
GetBBoxFun m_getbboxFun; // assigned getbbox_ function
char m_flags;
}; // class BBoxInfo
/********************************************************************
1.1.1 Class ~BBoxReg~
This class manages all defined getbbox functions.
********************************************************************/
class BBoxReg
{
public:
/*
Initializes the defined getbbox functions.
*/
static void initialize();
/*
Returns "true"[4], if the "initialize"[4] function has already been called.
*/
static inline bool isInitialized()
{ return initialized; }
/*
Adds a new "BBoxInfo"[4] object.
*/
static void addInfo(BBoxInfo info);
/*
Returns the name of the default getbbox function for the specified type.
*/
static std::string defaultName(const std::string &typeName);
/*
Returns the specified "BBoxInfo"[4] object.
*/
static BBoxInfo &getInfo(
const std::string &typeName, const std::string &getbbox_FunName);
/*
Returns "true"[4], if the specified "BBoxInfo"[4] object does exist.
*/
static inline bool isDefined(
const std::string &typeName, const std::string &getbbox_FunName)
{ return getInfo(typeName, getbbox_FunName).isDefined(); }
/*
Returns a string with a list of all defined getbbox functions for the specified type (could e.g. be used in the type mapping functions in case of errors to show possible values).
*/
static std::string definedNames(const std::string &typeName);
private:
typedef std::map<std::string, BBoxInfo>::iterator bboxIter;
static bool initialized;
static BBoxInfo defaultInfo;
static std::map<std::string, BBoxInfo> bboxInfos;
static std::map<std::string, std::string> defaultNames;
/********************************************************************
Defined getbbox functions:
********************************************************************/
/*
Getbbox function for the "real"[4] type constructor.
*/
static HRect *getbbox_Int(const void *attr);
/*
Getbbox function for the "real"[4] type constructor.
*/
static HRect *getbbox_Real(const void *attr);
/*
Getbbox function for spatial attributes.
Need to define seperate functions for each dimension duo to compiler errors under windows:
---- Internal compiler error in c_expand_expr, at c-common.c:3714
----
*/
static HRect *getbbox_Spatial2(const void *attr);
static HRect *getbbox_Spatial3(const void *attr);
static HRect *getbbox_Spatial4(const void *attr);
static HRect *getbbox_Spatial8(const void *attr);
/*
Getbbox function for the "hpoint" type constructor.
*/
static HRect *getbbox_HPoint(const void *attr);
/*
Getbbox function for the "bbox" type constructor.
*/
static HRect *getbbox_HRect(const void *attr);
}; // class BBoxReg
} // namespace gta
#endif // #ifndef __BBOX_REG_H__