i think is not possible put code of the class template in the ndll.cpp
file right?
[pheraps only the code of the template not use type <T>]
-----------------------
/*
FILE ndll.cpp
build the .dll and .lib
usare:
>bcc32 -v -WD ndll.cpp
>implib ndll.lib ndll.dll
*/
#include "fileI.h"
#include <stdio.h>
#include <stdarg.h>
int WINAPI
DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{(void) hinst; (void) lpReserved;
if(reason == DLL_PROCESS_ATTACH){}
else if(reason == DLL_PROCESS_DETACH){}
R 1;
}
int __export P(char* fmt, ... )
{va_list args;
int r;
va_start(args, fmt);
r=vfprintf(stderr, fmt, args);
va_end(args);
R r;
}
template<class T> __export permutazioni<T>::permutazioni(u32 a)
{u32 i;
n=0; arr=0; c=0; cnt=0; ji=0;
if(a==0||a>0xFF) {PBadAlloc=1; R;}
arr=(T*)MM( a*S(T) );
if(arr==0){PBadAlloc=1; R;}
c=(u32*)MM( a*S(u32) );
if(c==0){FF(arr); PBadAlloc=1; arr=0; R;}
n=a;
F(i=0; i<n; ++i){c[i]=0; arr[i]=i;}
}
template<class T> __export permutazioni<T>::~permutazioni(){FF(c);
FF(arr);}
template<class T> u32 __export permutazioni<T>::swp(T* a, u32 i, u32
j)
{T x;
if(i>=n||j>=n) R -1;
if(i==j) R 0;
x=a[i]; a[i]=a[j]; a[j]=x; ++cnt;
R 0;
}
template<class T> u32 __export permutazioni<T>::index(T* a)
{u32 r;
if(arr==0||a==0) R -1;
if( !(arr<=a&&a<arr+n) ) R -1;
r=a-arr;
if(r>0xFFFFFF) R -1;
r=r/S(T);
R r;
}
// b=a^-1 b[a]=I=1,2,3,4,5...n
// a= 1 3 2 (1->1, 2->3 3->2) b= 1 3 2
// i->j j->i
template<class T> i32 __export
permutazioni<T>::inverse(permutazioni<T>& a)
{u32 i;
T t;
if(arr==0||n!=a.n) R -1; // devono avere lo stesso n
F(i=0; i<n; ++i)
{t=a.arr[i];
if(!(0<=t&&t<n)) R -1;
arr[t]= i ; // deve essere arr[a.arr[i]]=i;
}
nextP(0); // azzera next permutation
}
/* from Sedgewick, result in arr [3!=6] */
template<class T> u32 __export permutazioni<T>::nextP(u32 a)
{u32 k;
if(a==0)
{F(k=0; k<n; ++k) c[k]=0;
ji=0; cnt=0;
R 1;
}
F( ; ji<n; )
{if(c[ji]<ji)
{swp(arr, ((ji+1)%2? 0: c[ji]) , ji);
++c[ji]; ji=1; // can be ok ji=0; too
R 1; // ok
}
else c[ji++]=0;
}
R 0; // for end
}
template<class T> i32 __export permutazioni<T>::e(void){R
PBadAlloc;}
template<class T> T& __export permutazioni<T>::operator[](i32 i){R
arr[i];}
template<class T> void __export permutazioni<T>::print(void)
{u32 i;
F(i=0; i<n; ++i)
if(i==0 ) cout<<"[ "<< arr[i]<<" ";
else if(i==n-1) cout<<arr[i]<<" ] ";
else cout<<arr[i]<<" ";
}
------------------------
/*FILE fileI.h */
#ifndef fileI
#define fileI
#ifndef fileII
#include "fileII.h"
#endif
class __export permutazioni;
int __export P(char* , ...);
#endif
---------------------------
/*FILE fileII.h */
#ifndef fileII
#define fileII
#include <stdlib.h>
#include <windows.h>
#define uns unsigned
#define u32 unsigned
#define u64 unsigned __int64
#define i32 int
#define i64 __int64
#define u16 unsigned short
#define u8 unsigned char
#define i8 char
#define i16 short
#define long_long __int64
#define d64 double
#define sdC __stdcall
#define ooo cout
#define S sizeof
#define MM malloc
#define FF free
#define F for
#define R return
#define W while
#define GG(a,b) if(a)goto b
#define G goto
#ifndef NULL
#define NULL ((char*)0)
#endif
template<class T> class permutazioni{
public:
permutazioni(u32 );
~permutazioni( );
u32 swp(T* , u32 , u32 );
u32 index(T* );
i32 inverse(permutazioni<T>& );
u32 nextP(u32 );
void print(void);
i32 e(void);
T& operator[](i32 );
u32 n; /* number of element index 0..n-1 */
T *arr; /* where they are */
u32 *c; /* index array for find next permutation*/
u32 ji; /* index for next permutation: nextP() */
u32 cnt; /* cnt%2?-1:1 sign of permutation nextP() return*/
/* if some allocation error for all permutation here 1 */
static u32 PBadAlloc;
};
template<class T> u32 permutazioni<T>::PBadAlloc=0;
template<class T> class permutazioni1{
public:
permutazioni1(u32 );
~permutazioni1( );
u32 swp(T* , u32 , u32 );
u32 index(T* );
i32 inverse(permutazioni1<T>& );
u32 nextP(u32 );
void print(void);
i32 e(void);
T& operator[](i32 );
u32 n; /* number of element index 0..n-1 */
T *arr; /* where they are */
u32 *c; /* index array for find next permutation*/
u32 ji; /* index for next permutation: nextP() */
u32 cnt; /* cnt%2?-1:1 sign of permutation nextP() return*/
/* if some allocation error for all permutation here 1 */
static u32 PBadAlloc;
};
template<class T> u32 permutazioni1<T>::PBadAlloc=0;
template<class T> __export permutazioni1<T>::permutazioni1(u32 a)
{u32 i;
n=0; arr=0; c=0; cnt=0; ji=0;
if(a==0||a>0xFF) {PBadAlloc=1; R;}
arr=(T*)MM( a*S(T) );
if(arr==0){PBadAlloc=1; R;}
c=(u32*)MM( a*S(u32) );
if(c==0){FF(arr); PBadAlloc=1; arr=0; R;}
n=a;
F(i=0; i<n; ++i){c[i]=0; arr[i]=i;}
}
template<class T> __export permutazioni1<T>::~permutazioni1(){FF(c);
FF(arr);}
template<class T> u32 __export permutazioni1<T>::swp(T* a, u32 i, u32
j)
{T x;
if(i>=n||j>=n) R -1;
if(i==j) R 0;
x=a[i]; a[i]=a[j]; a[j]=x; ++cnt;
R 0;
}
template<class T> u32 __export permutazioni1<T>::index(T* a)
{u32 r;
if(arr==0||a==0) R -1;
if( !(arr<=a&&a<arr+n) ) R -1;
r=a-arr;
if(r>0xFFFFFF) R -1;
r=r/S(T);
R r;
}
// b=a^-1 b[a]=I=1,2,3,4,5...n
// a= 1 3 2 (1->1, 2->3 3->2) b= 1 3 2
// i->j j->i
template<class T> i32 __export
permutazioni1<T>::inverse(permutazioni1<T>& a)
{u32 i;
T t;
if(arr==0||n!=a.n) R -1; // devono avere lo stesso n
F(i=0; i<n; ++i)
{t=a.arr[i];
if(!(0<=t&&t<n)) R -1;
arr[t]= i ; // deve essere arr[a.arr[i]]=i;
}
nextP(0); // azzera next permutation
}
/* from Sedgewick, result in arr [3!=6] */
template<class T> u32 __export permutazioni1<T>::nextP(u32 a)
{u32 k;
if(a==0)
{F(k=0; k<n; ++k) c[k]=0;
ji=0; cnt=0;
R 1;
}
F( ; ji<n; )
{if(c[ji]<ji)
{swp(arr, ((ji+1)%2? 0: c[ji]) , ji);
++c[ji]; ji=1; // can be ok ji=0; too
R 1; // ok
}
else c[ji++]=0;
}
R 0; // for end
}
template<class T> i32 __export permutazioni1<T>::e(void){R
PBadAlloc;}
template<class T> T& __export permutazioni1<T>::operator[](i32 i){R
arr[i];}
template<class T> void __export permutazioni1<T>::print(void)
{u32 i;
F(i=0; i<n; ++i)
if(i==0 ) cout<<"[ "<< arr[i]<<" ";
else if(i==n-1) cout<<arr[i]<<" ] ";
else cout<<arr[i]<<" ";
}
#endif
---------------------------
/*FILE fileIII.h */
#ifndef fileIII
#define fileIII
#ifndef fileII
#include "fileII.h"
#endif
class __import permutazioni;
int __import P(char* , ...);
#endif
--------------------------
/*
FILE fileCpp.cpp
>bcc32 -v fileCpp.cpp ndll.lib
not compile the first g() function
compile ok the second g() function
*/
#include "fileIII.h"
#include <iostream.h>
//this not compile
i32 g(void)
{u32 i, r, j;
permutazioni<u32> m(3);
permutazioni<u8> v(4);
char *ptr="mare";
if(m.e()) R 0;
F(i=0; i<m.n; ++i)
m[i]=i;
F(;;){m.print();
GG( (r=m.nextP(1))==-1 || r==0, m1);
}
m1:
F(i=0; i<v.n; ++i)
v[i]=ptr[i];
F(;;){v.print();
GG( (r=v.nextP(1))==-1 || r==0, la);
}
la:
P("\n");
R 0;
}
/*
//this compile
i32 g(void)
{u32 i, r, j;
permutazioni1<u32> m(3);
permutazioni1<u8> v(4);
char *ptr="mare";
if(m.e()) R 0;
F(i=0; i<m.n; ++i)
m[i]=i;
F(;;){m.print();
GG( (r=m.nextP(1))==-1 || r==0, m1);
}
m1:
F(i=0; i<v.n; ++i)
v[i]=ptr[i];
F(;;){v.print();
GG( (r=v.nextP(1))==-1 || r==0, la);
}
la:
P("\n");
R 0;
}
*/
int main(void)
{g();
R 0;
}